2009-12-06 6 views
13

나는 마당을 많이 사용 즐기고 있었다 :PEG 문법 및 파서 생성기의 제한 사항은 무엇입니까?

http://www.ootl.org/yard/

http://code.google.com/p/yardparser/

http://www.codeproject.com/KB/recipes/yard-tokenizer.aspx

내가 완전한 기능 계산기를 구축 할 수 있었다. 나는 PHP 파서를하기 위해 YARD를 평가 중이다. PEG 문법 & 파서 생성기의 한계에 대해 친절하게 조언 해주십시오. 고마워요!

+0

PHP를 구문 분석하는 경우 [phc] (http://phpcompiler.org)를 사용하는 것이 좋습니다. –

답변

16

PEG의 큰 "문제"는 근본적으로 다른 방식으로 작동하므로 문법의 일반적인 분류법에 맞지 않는다고 생각합니다. 일반 문법은 생성 될 수있는 모든 가능한 문장 (프로그램)을 설명한다는 의미에서 "뒤로"있습니다. PEG는 구문 분석하는 방법을 설명합니다. 상대방의 문제에서 발생합니다.

내 생각에 이것은 문제를 생각하는 좀 더 자연스러운 방법이며, 필자가 직접 작성한 (재귀 - 하강) 파서에 대해서는 다른 어떤 것도하지 않을 것입니다.

+1

감사합니다 DrPizza! 문맥에 민감한 부분에서 PEG가 파이썬과 C++을 구문 분석 할 수 없다는 것을 읽었습니다. 이것이 사실 일지 확신하지 못합니다. 나는 PHP 파서를 작성하려고하는데, Bison/Yacc에 비해 PEG 솔루션을 매우 쉽게 찾을 수 있습니다. – Viet

+3

대부분의 파서는 상황에 맞는 문법을 제대로 처리하지 못합니다 (예 : C를 파싱하려면 파서를 다시 렉서로 보내 유형 이름에 올바른 기호 유형을 할당하므로 정규 식별자로 처리). PEG는 C 및 C++에서 사용하는 불분명 규칙을 직접 표현할 수 있기 때문에 흥미 롭습니다 (저는 파이썬에 대해 몰라요). 특히, "선언처럼 보이는 경우"입니다. 명령문 규칙 앞에 선언 규칙이 적용되도록 규칙을 정렬하여이 작업을 수행 할 수 있습니다. – DrPizza

+0

즉, PEG가 전체 C++ 또는 Python 문법을 처리 할 수 ​​있는지 여부는 알 수 없습니다. 나는 시도하지 않았다. – DrPizza

4

PEG 문법의 주된 한계는 모호성을 전혀 다루지 않는다는 것입니다.

모호성을 다루는 것이 CFG (문맥 자유 문법) 도구를 사용하는 데있어서 가장 실망스러운 부분 중 하나이기 때문에 이것은 또한 장점이기도합니다.

PEG를 사용하면 모호하게 일치하지만 원하지 않는 다른 규칙보다 먼저 일치시킬 규칙을 순서대로 지정하여 모호성을 명시 적으로 처리합니다.

문제는 언어 나 문법 및 PEG 생성기의 모호성에 대해 항상 알지 못하는 것입니다. 적어도 내가 시도한 것들은 모호성에 대한 문법을 ​​분석하지 않습니다. 그 (것)들을 찾아 내기 위하여 그 후에 그 (것)들을 취급하기 위하여 당신의 규칙을 디자인하고 주문할 것을 돕기 위하여.

yacc 및 bison과 같은 CFG 파서 생성기는 문법을 분석하고 모든 모호성을보고합니다. 불행하게도 그들은 때로는 이해하기 어렵게 만들 수있는 매우 신비한 방식으로 그들을보고합니다. 물론 문법을 고치는 것이 종종 어렵습니다. 그러나 적어도 당신은 그들이 존재한다는 것을 알게 될 것입니다.

PEG 문법을 사용하면 개념 문법의 애매 모호함을 알지 못할 수 있습니다. 일단 PEG를 만들면 모호함이 없으므로 일치 규칙과 일치 할 수있는 조용히 도달 할 수없는 규칙이 생길 수 있습니다. 우선 순위가 더 높은 경우 테스트 결과에 표시되지 않을 수도 있지만 출시 후 표시 될 수 있습니다.

CFG 문법을 사용하면 개발 중 모호성을 처리해야하지만 쉽지는 않을 것입니다. PEGs and Packrat Parsing are not the answer : 나는 그것을 명확하게하고 있지 않다 경우에


, 여기에 람다 궁극적 인 프로그래밍 언어 블로그에 여섯 살짜리 여호수아 Haberman에 의해 논의 끝났습니다.

+1

* 일단 PEG로 만들면 모호성이 더 이상 없습니다 *. 사실, 당신은 PEG에 대한 당신의 힘 ("이것보다 우선")을 * 대답으로 생각할 수 있습니다. 그러나 많은 경우, 특히 표현력을 지원하기 위해 언어가 모호하고 코드의 컨텍스트없는 정보를 사용하여 모호성을 해결하는 것이 좋습니다. C++이 도처에 가지고있는 모호성이 반드시 도움이된다고 주장하지는 않지만, GLR로 전환하면 파싱 과정에서 애매 모호 할 수도 있습니다. (PEG는 임의의 미리보기를합니까?) http://stackoverflow.com/a/1004737/120163 –

+0

PEG가 임의의 미리보기를 수행 할 것인지 확실치 않습니다. –

+0

며칠 전에 PEG를 가지고 노는 것을 시작 했으므로 나는 전문가는 아니지만 임의의 선견자에 대해 확신했다. 실제로 사람들이 다른 표식으로 골라내는 것을 본 적이있다. 나는 JavaScript를위한 GLR 도구를 사냥했지만 PEG.js와 Jison과 동등한 것을 찾지 못했습니다. – hippietrail

관련 문제