0

flex bison を使用して if 構文を書き込もうとしていますが、パーサーに問題があります

これは、cpp の if 構文の文法です。

    program : //start rule
         |statements;
    block:
        TOKEN_BEGIN statements ';'TOKEN_END;
    reexpression:
    |   TOKEN_OPERATOR expression;

    expression:  //x+2*a*3
        TOKEN_ID reexpression
    |   TOKEN_NUMBER reexpression;


    assignment:
        TOKEN_ID'='expression
    statement:
        assignment;
    statements:
        statement';'
    |   block
    |   if_statement;

    else_statement:
        TOKEN_ELSE statements ;

    else_if_statement:
        TOKEN_ELSE_IF '(' expression ')' statements;

    if_statement:
        TOKEN_IF '(' expression ')' statements else_if_statement else_statement;

これらの 3 つのルールを置き換えると、左再帰が発生する理由がわかりません。これらのルールにラムダを追加するだけです。

     else_statement:
        |TOKEN_ELSE statements ;

     else_if_statement:
        |TOKEN_ELSE_IF '(' expression ')' statements;

     if_statement:
        TOKEN_IF '(' expression ')' statements else_if_statement else_statement;

私が理解するのを手伝ってください。

4

1 に答える 1

3

ラムダ左再帰は関係ありません。

イプシロンを if ルールに追加すると (else をオプションにする)、結果の文法があいまいになるため、競合が発生します。これは、else が 1 つの場合に if が 2 つある場合に、else がいずれかの if にバインドできるという、古典的なぶら下がっている else のあいまいさです。

IF ( expr1 ) IF ( expr2 ) block1 ELSE block2
于 2014-01-18T18:47:06.037 に答える