2016-12-20 1 views
0

에 conflits을 줄일 나는 다음 파서 있습니다시프트/ocamlyacc

%{ 

open t 
open Lexer 

%} 
%token <int> INT 
%token <float> FLOAT 
%token <char> CHAR 
%token <bool> BOOL 

    %token PLUS Menos Mult Div Bigger Smaller MINUS TIMES 
    %token Equals Atribuicao SoE BoE And Or 
    %token IF THEN ELSE BEGIN END FUNCTION WHILE SEQ RANGE DEF RETURN OF TO PV VIR DD 
    %token RP LP SPL SPR LB RB 
    %token EOL 




     %left PLUS MINUS  /* lowest precedence */ 
     %left TIMES Div   /* medium precedence */ 
     %nonassoc UMINUS  /* highest precedence */ 
     %start main   /* the entry point */ 

%type <int> main %%    
main: 
| expr EOL    { $1 } 

    expr:   
     INT    { $1 } 
    | IF LP expr RP   { $3 } 
    | BEGIN expr END  { $2 } 
    | RETURN expr PV  { $2 } 
    | LP expr RP   { $2 } 
    | expr PLUS expr  { $1 + $3 } 
    | expr MINUS expr  { $1 - $3 } 
    | expr TIMES expr   { $1 * $3 } 
    | expr Div expr    { $1/$3 } 
    | MINUS expr %prec UMINUS { - $2 } 

나는 그것이 완료되지 않은 것을 알고 난 여전히 그것을 구축하고 올바르게/선돌을 ocamlyacc 사용하는 방법을 배우고있다. 그것은 나에게 10 이동/갈등을 줄일 수 있습니다 | expr Bigger expr {$1 > $3} ...하지만이 같은 괄호이 줄을 추가 할 때 :

그럼 내가이 줄을 추가 할 때 '

| LP expr RP Bigger LP expr RP {$2 > $6} LP는'('대표와 RP가 나타내는) '

그것은 완벽하게 맞는 나에게 오류없이 변화를주지 않는다/충돌

이 문제의 올바른 솔루션을 줄이기? 그렇다면 왜? 질문이 하나 더 있습니다. 파서에서 잘못된 것을하고 있습니까? 아니면 그냥 완료되지 않았습니까?

감사합니다.

답변

1

BiggerSmaller 필요는 수학 연산과 함께 %left 또는 %right
결합으로 선언한다 :

%left Bigger Smaller 
%left PLUS MINUS 
%left TIMES Div 
%nonassoc UMINUS 
+0

그것은 정확하고 잘못된 thnx 무엇인지 이해하는 것이 나에게 도움이 –