2009-06-04 3 views
0

임 내가 yacc에를 구축했다도움말/충돌을 감소 - 모델 시도 (XA) * (XB) * ​​

("declare" "namespace" ";")* ("declare" "variable" ";")* 

EBNF 식을 모델링하기 위해 노력하고, 문법 (임 MPPG 사용)하는 것 같다 이것을 나타낼 수는 있지만 테스트 표현과 일치하지 않습니다.

내가 일치하도록 노력하고있어 테스트 케이스/갈등을 줄일 수 렉서에서 토큰 스트림 문법 구문 분석은 "시프트가 말한다

KW_Declare 
KW_Variable 
Separator 

입니다

declare variable; 

입니다 상태 (6) 에 KW_Declare ". "% left PrologHeaderList PrologBodyList"를 사용하여이 문제를 해결하려고 시도했지만 어느 솔루션도 작동하지 않습니다. ";"

Program      : Prolog; 
Prolog      : PrologHeaderList PrologBodyList; 

PrologHeaderList   : /*EMPTY*/ 
          | PrologHeaderList PrologHeader; 
PrologHeader    : KW_Declare KW_Namespace Separator; 

PrologBodyList    : /*EMPTY*/ 
          | PrologBodyList PrologBody; 
PrologBody     : KW_Declare KW_Variable Separator; 

KW_Declare KW_Namespace KW_Variable 세퍼레이터, "naemsapce"를 "선언", "가변"값을 가진 모든 토큰이다.

답변

3

필자는 yacc와 비슷한 것을 사용 했으므로 오랜 시간이 걸렸지 만 여기에 도움이 될 수도 있고 도움이되지 않을 수도있는 몇 가지 제안이 있습니다.

이 상황에서 2 토큰 미리보기가 필요합니다. 파서는 지난 PrologHeader에 도달하고 다음 구조가 PrologHeader 또는 PrologBody 여부를 결정해야하고, 그것은 KW_Declare에서 해당 말할 수 없습니다. 이 상황에서 미리보기를 높이기위한 지침이 있다면 아마 문제를 해결할 것입니다.

당신은 또한 당신의 행동으로 상황을 소개 할 수 :보다는 PrologBodyListPrologHeaderList을 정의 PrologRuleList을 정의하고 헤더가 몸 후에 나타나는 경우 조치가 오류가 발생합니다. 추악한,하지만 가끔은 당신이 그것을 할 필요가 : 문법에 단순하게 나타나는 것은 생성 된 파서에서 간단하지 않을 수 있습니다. 보다는 KW_DeclareKW_Variable 당신 렉서가 공간을 인식하고 KW_Declare_Variable를 사용하게 :

hackish 접근 방식은 토큰을 결합 할 수 있습니다. 둘 다 키워드이므로 네임 스페이스 충돌 문제는 발생하지 않습니다.

+0

이것이 결국 채택한 접근 방식입니다. 나는 코드에서 검증을 할 수 있다고 생각한다. – Sprotty

0

맨 위의 문법은 규칙적이므로 IIRC를 사용하면 DFA (또는 NDA로 변환하여 DFA로 변환) 한 다음 DFA를 문법으로 변환 할 수 있습니다. 콩은 한참 동안 작업을 독자의 연습으로 남겨 둘 것입니다.