2010-07-13 2 views
7

저는 학습 목적으로 C++에서 구문 분석과 토큰 화를하고 싶습니다. 이제 나는 온라인으로이 주제에 관해 읽을 때 들소/yacc와 lex를 종종 만났습니다. 예를 들어 tokenizer/parser를 STL 또는 boost :: regex 또는 어쩌면 C를 사용하여 작성한 것을 사용하면 어떤 이점도 있습니까?C++ 자조 tokenizer/파서에 lex와 bison의 이점은 무엇입니까

답변

13

저는 최근에 간단한 렉서와 파서를 작성했습니다.

렉서가 손으로 코딩하는 것이 더 간단하다는 것이 밝혀졌습니다. 그러나 파서는 좀 더 어려웠습니다. 내 Bison 생성 파서는 박쥐에서 거의 바로 작동했으며, 내가 국가에 대해 잊어 버린 곳에 대한 유용한 메시지를 많이주었습니다. 나중에 손으로 같은 파서를 썼지 만 완벽하게 작동하기 전에 훨씬 더 많은 디버깅이 필요했습니다.

렉서와 파서를위한 툴을 생성하는 것은 사용자가 스펙을 최대한 짧게 만들 수있는 깨끗하고 읽기 쉬운 언어로 스펙을 작성할 수 있다는 것입니다. 손으로 쓴 파서는 일반적으로 적어도 두 배 이상 큽니다. 또한, 자동 파서 (/ 렉서)에는 많은 디버깅 코드와 로직이 포함되어있어 디버깅 된 것을 얻을 수 있습니다.

BNF와 유사한 언어의 구문 분석기/렉서 (parser/lexer) 사양은 언어 나 요구 사항이 변경 될 경우 변경하기가 훨씬 쉽습니다. 손으로 쓴 파서/렉서를 다루는 경우, 코드를 깊이 파고 중요한 변경을해야 할 수도 있습니다.

마지막으로 백 트랙킹이없는 유한 상태 머신으로 구현되기 때문에 (Bison의 옵션이 너무 많기 때문에 이것이 항상 주어진 것은 아닙니다) 자동 생성 코드가 사용자의 손보다 효율적일 수 있습니다 코딩 된 제품.

+0

귀하의 자세한 답변을 주셔서 감사합니다, 나는 그저 재미를 위해 어쨌든 이후 비교를 위해 모두를 시도 할 것 같아요! – moka

4

다른 사람이 이미 작성하고 디버깅했습니다.

1

더 쉽고 더 일반적입니다. Bison/Lex는 임의의 문법을 토큰 화하고 구문 분석하여보다 쉬운 형식이 될 수 있도록 제시 할 수 있습니다. 정규식을 얼마나 잘 작성했는지에 따라 더 빠를 수도 있습니다.

언어에 문자열에 대한 큰 직관이 없으므로 C에서 자체 파서를 작성하고 싶지 않습니다. 당신이 직접 작성한다면, 나는 정규식 (또는 아마 파이썬)의 용이성을 위해 perl을 추천 할 것이다.

기존 도구를 사용하는 것이 더 빠르지 만 재미가 없을 수도 있습니다. 시간이 있고 학습을위한 것이기 때문에 그것을 찾으십시오. C++은 좋은 언어입니다.

+4

그들은 "임의의 문법"을 확실히 파싱 할 수 없습니다. –

0

다른 사람들을위한 스트로크가 다릅니다. 필자는 개인적으로 재귀 적 파생어 파서를 좋아합니다. 이해하기 쉽기 때문에 bison과 같은 도구에서 생성 된 오류 메시지보다 우수한 최종 사용자 오류 메시지를 생성 할 수 있습니다.

+0

또한 구문 분석과 렉싱이 겹치는 일부 언어에서는 까다로운 엣지 경우에도 조금 더 강력 해졌습니다. – Kylotan

관련 문제