YACC(LALR)是否解析了左递归语法

时间:2016-09-08 05:06:15

标签: parsing yacc lex left-recursion

我正在做一个简单的C解析器项目。 当我为if-else构造编写语法时发生了这个问题。

我写的语法如下:

iexp:   IF OP exp CP block eixp END{
                printf("Valid if-else ladder\n");
        };

eixp:
        |ELSE iexp
        |ELSE block;

exp:     id
        |NUMBER
        |exp EQU  exp
        |exp LESS exp
        |exp GRT  exp
        |OP exp CP;

block:  statement
        |iexp
        |OCP statement CCP
        |OCP iexp CCP;

statement: id ASSIGN NUMBER SEMICOL;

id:     VAR;

lex部分看起来像这样

"if"            {return IF;}
"else"          {return ELSE;}
[0-9]+          {return NUMBER;}
">"             {return GRT;}
"<"             {return LESS;}
"=="            {return EQU;}
"{"             {return OCP;}
"}"             {return CCP;}
"("             {return OP;}
")"             {return CP;}
"$"             {return END;}
";"             {return SEMICOL;}
"="             {return ASSIGN;}
[a-zA-Z]+       {return VAR;}
.               {;}

我正在接受o / p

yacc: 9 shift/reduce conflicts, 1 reduce/reduce conflict.

当我消除exp派生时的左递归时,冲突消失了,但为什么会这样呢?

消除左递归后修改后的语法是:

exp:     id
        |NUMBER
        |id EQU  exp
        |id LESS exp
        |id GRT  exp
        |OP exp CP;

我能够成功解析语法以评估算术表达式。这是%右,%左是否成功

%token ID
%left  '+' '-'
%left  '*' '/'
%right NEGATIVE
%%

S:E {
        printf("\nexpression : %s\nResult=%d\n", buf, $$);
        buf[0] = '\0';
 };
E: E '+' E {
        printf("+");
        ($$ = $1 + $3);
 } |
   E '-' E {
        printf("-");
        ($$ = $1 - $3);
 } |
   E '*' E {
        printf("*");
        ($$ = $1 * $3);
 } |
   E '/' E {
        printf("/");
        ($$ = $1 / $3);
 } |
   '(' E ')' {
        ($$ = $2);
 } |
   ID {
        /*do nothing done by lex*/
 };

0 个答案:

没有答案