일반적인 (특히 부울 논리) 표현식을 구문 분석하려면 Peg 구문 분석기가 거의 필요하지 않습니다. 실제로 되돌아 갈 필요가 없습니다. 구문 분석 엔진을 선택하여 사용하십시오 (주장하는 경우 Peg 엔진 포함). 당신이 코드 쉬운 손으로 쓴, 재귀 하강 파서를 사용하여이 문법을 구현하려면
EXPRESSION = DISJUNCTION ;
DISJUNCTION = CONJUNCTION ('|' CONJUNCTION)*;
CONJUNCTION = TERM ('&' TERM);
TERM = '~' TERM | '(' EXPRESSION ')' | CONDITION ;
CONDITION = VARIABLE '=' CONSTANT ;
, 내 SO하는 방법에 대한 답변을 참조하십시오 여기에
은 예를 들어 작동 문법이다 do
Is there an alternative for flex/bison that is usable on 8-bit embedded systems?
스택 오버플로 : 표현식이 수 백 레벨 ("괄호")으로 중첩되어 있지 않으면 대부분의 Windows 또는 Linux 시스템에서 사용 가능한 스택이 적용되는 파서의 스택 요구량보다 훨씬 큽니다. 사람들이 실제로 쓰는 표현. 거대한 표현으로, 꽤 많은 사람들이 어쨌든 그것을 읽을 수 없으므로 발생하지 않습니다. OP의 예제 표현식은 몇 개의 스택 항목 중첩을 필요로합니다.
본격적인 프로그래밍 언어에 대한 문법을 작성하고 누군가가 그 언어에 크고 복잡한 프로그램을 작성하면 스택 오버플로가 발생할 수 있습니다. 나는 256 메가 바이트 (스택 프레임)의 중첩이 Windows 1Mb 스택 공간에 쉽게 들어갈 수있는 컴파일러를 사용하여 경험을 통해 말할 수 있으며 인류에게 알려진 모든 이상한 구문과 깊이 중첩 된 어휘 범위 지정 스턴트로 2 백만 라인 프로그램을 컴파일하는 데 충분합니다. 그 안에.
안녕하세요. Ira. 좋은 답변 주셔서 감사합니다 :) 사실 파서 생성기에 먹이기 위해 PEG 문법이 필요합니다. 제가 "중첩 된"이라는 말은 문법이 이상적으로 이진 트리를 생성하지 않아야한다는 것입니다. 표현에 많은 OR과 AND가있는 경우 매우 깊은 트리가됩니다. 내가 가지고있는 문법은 바로 재귀 적 (적절한 용어라고 생각합니다)이며 매우 긴 표현식 (괄호 없이도)에 대해 스택 오버플로가 발생합니다 : https://github.com/kschiess/parslet/blob/master/example/boolean_algebra. rb – SoupMonster
감사합니다 아이라. 디버그 지원이 부족하기 때문에 PEG 문법 - 파서 - 생성기를 사용하는 것을 포기했습니다. 나는 당신의 손으로 쓰는 접근법을 갈 것이라고 생각합니다! :) – SoupMonster