는 (등 예 YACC, 들소,)는 LR-가족 구문 분석 발전기 문법 같은 규칙을 고려 :부정적 예측 분석 알고리즘
Nonterminal : [ lookahead not in {Terminal1, ..., TerminalN} ] Rule ;
그것은 그것이 제한이 점을 제외하고, 일반적인 규칙입니다 :이 규칙으로 생성 된 문구는 Terminal1, ..., TerminalN
으로 시작할 수 없습니다. (물론,이 규칙은 일반적인 규칙 세트로 대체 될 수 있지만 더 큰 문법이 될 것입니다.) 이는 충돌을 해결할 때 유용 할 수 있습니다.
질문은 그러한 제한을 허용하는 LR 테이블 생성 알고리즘이 수정 되었습니까? 그러한 수정은 가능합니다 (우선 순위 관계와 같은).
확실히, 그것은 런타임 체크,하지만 난 체크인 시간 컴파일을 의미 할 수있다 (%prec
처럼 파싱 테이블을 구축하는 동안 수행되는 검사, %left
, yacc를-compartible 발전기 %right
및 %nonassoc
지시를.)
답변 해 주셔서 감사합니다. 네, 예를 들어, ECMA-262 문법입니다 (http://www.ecma-international.org/ecma-262/5.1, 예 : 12.4 절). 이 문법은'Expression' 프로덕션을 제한이 있건 없든 모두 사용하기 때문에'Experssion'을 설명하는 문법 부분을 두 배로 늘려야합니다. 내 LALR (1) 파서 생성기에서는 훨씬 많은 상태 (350 대 470)로 연결됩니다. 350 개의 주를 유지하고 제한을 만족시키는 것은 매우 좋을 것입니다. – skvadrik