Соответствие с аналогичными правилами в YACC - PullRequest
0 голосов
/ 17 мая 2018

В программе yacc + lex, с этими правилами (и другими) в файле yacc,

stmt    : ';'
        | expr ';'      { /*code*/ }
        | IF '(' expr ')' stmt  { /*code*/ }
        | IF '(' expr ')' stmt ELSE stmt { /*code*/ }
.
.
.
.

Если входные данные примерно такие:

if(1<2) {return 5;}

бытие "(1 <2) "expr и" {return 5} "stmt, это соответствует.В противном случае, если ввод выглядит как: </p>

if(1<2) {return 5;} else {return 2;}

, он не совпадает ...

Я попытался изменить ассоциативность ELSE и IF ... и он говорит "синтаксисошибка".

РЕДАКТИРОВАТЬ1:

expr определяется как:

expr    : ID   '=' expr { emit(dup); emit2(istore, $1->localvar); }
    | ID   PA  expr { emit2(iload, $1->localvar); emit(iadd); emit(dup); emit2(istore, $1->localvar); }
    | ID   NA  expr { emit2(iload, $1->localvar); emit(isub); emit(dup); emit2(istore, $1->localvar); }
    | ID   TA  expr { emit2(iload, $1->localvar); emit(imul); emit(dup); emit2(istore, $1->localvar); }
    | ID   DA  expr { emit2(iload, $1->localvar); emit(idiv); emit(dup); emit2(istore, $1->localvar); }
    | ID   MA  expr { emit2(iload, $1->localvar); emit(irem); emit(dup); emit2(istore, $1->localvar); }
    | expr EQ  expr { emit3(if_icmpeq, 7); emit(iconst_0); emit3(goto_, 4); emit(iconst_1); }
    | expr NE  expr { emit3(if_icmpne, 7); emit(iconst_0); emit3(goto_, 4); emit(iconst_1); }
    | expr '<' expr { emit3(if_icmplt, 7); emit(iconst_0); emit3(goto_, 4); emit(iconst_1); }
    | expr '>' expr { emit3(if_icmpgt, 7); emit(iconst_0); emit3(goto_, 4); emit(iconst_1); }
    | expr LE  expr { emit3(if_icmple, 7); emit(iconst_0); emit3(goto_, 4); emit(iconst_1); }
    | expr GE  expr { emit3(if_icmpge, 7); emit(iconst_0); emit3(goto_, 4); emit(iconst_1); }
    | expr '+' expr { emit(iadd); }
    | expr '-' expr { emit(isub); }
    | expr '*' expr { emit(imul); }
    | expr '/' expr { emit(idiv); }
    | expr '%' expr { emit(irem); }
    | '(' expr ')'
    | '$' INT8      { emit(aload_1); emit2(bipush, $2); emit(iaload); }
    | ID            { emit2(iload, $1->localvar); }
    | INT8          { emit2(bipush, $1); }
    | INT16         { emit3(sipush, $1); }
    | INT32         { emit2(ldc, constant_pool_add_Integer(&cf, $1)); }
    | FLT       { error("float constant not supported in Pr3"); }
    | STR       { error("string constant not supported in Pr3"); }
    ;

1 Ответ

0 голосов
/ 17 мая 2018

В скрипте yacc у меня есть выражение if, определенное следующим образом:

if_statement : IF  b_expr   
                   statement
               else_part
             ;

else_part    : ELSE
                statement
             | empty
             ;
...