2013-04-11 2 views
0

Jison (자바 스크립트 파서)에서 매우 간단한 언어를 정의하여 구문 분석을 시도하고 있습니다. bison과 동일한/매우 유사한 구문을 허용합니다. 나는 하나의 변화를 얻고있다들소에서이 변화/감소 충돌은 어디에서 오는가?

%token INT TRUE FALSE WHILE DO IF THEN ELSE LOCATION ASSIGN EOF DEREF 

%left "+" 
%left ">=" 

/* Define Start Production */ 
%start Program 

/* Define Grammar Productions */ 
%% 

Program 
    : Statement EOF 
    ; 

Statement 
    : Expression 
    | WHILE BoolExpression DO Statement 
    | LOCATION ASSIGN IntExpression 
    ; 

Expression 
    : IntExpression 
    | BoolExpression 
    ; 

IntExpression 
    : INT IntExpressionRest 
    | IF BoolExpression THEN Statement ELSE Statement 
    | DEREF LOCATION 
    ; 

IntExpressionRest 
    : /* epsilon */ 
    | "+" IntExpression 
    ; 

BoolExpression 
    : TRUE 
    | FALSE 
    | IntExpression ">=" IntExpression 
    ; 

%% 

/갈등을 줄일 :

여기 내 문법이다. Jison의 출력은 여기에 있습니다 :

Conflict in grammar: multiple actions possible when lookahead token is >= in state 6 
- reduce by rule: Expression -> IntExpression 
- shift token (then go to state 17) 

States with conflicts: 
State 6 
    Expression -> IntExpression . #lookaheads= EOF >= THEN DO ELSE 
    BoolExpression -> IntExpression .>= IntExpression #lookaheads= EOF DO THEN ELSE >= 

답변

-1

귀하의 문제는 ELSE가 첫 번째 또는 두 번째 IF에 속하는 경우가 IF에 포함 된 후 성명, 어떻게 당신이 알고있는 경우

IF BoolExpression THEN Statement ELSE Statement 

에서 온다? 자세한 내용은 여기를 참조하십시오. http://www.gnu.org/software/bison/manual/html_node/Shift_002fReduce.html

모호하지 않은 100 % 수정 사항은 if/else 문 (대부분의 언어는 대괄호 "{"및 "}"을 사용) 주위에 구분 기호를 요구하는 것입니다. 예는

IF BoolExpression THEN '{' Statement '}' ELSE '{' Statement '}' 
+0

죄송합니다. 이번에는 if/then/else 문제가 없습니다. 그의 'ELSE'는 선택 사항이 아니기 때문에이 표준 함정을 피할 수있는 아주 좋은 방법입니다. –

1

귀하의 이동은 >=Expression 비 터미널의 후속 세트에 있기 때문에 충돌이 감지 줄일 수 있습니다. 이는 기본적으로 StatementExpression이고 IntExpressionstatement으로 끝날 수 있다는 사실에 기인합니다. 다음 입력을 고려해보십시오. 괄호로 인해 모호한 부분이 있다면 (IF c THEN S1 ELSE S2) >= 42IF c THEN S1 ELSE (S2 >= 42)으로 해석 될 수 있습니다. 전환이 전환보다 선호되므로 후자가 선택됩니다.