0

Я пытаюсь писать, если синтаксис с помощью гибких бизонов и синтаксического анализа У меня есть проблемаПочему, если я добавляю лямбда-левую рекурсию?

здесь грамматика, если синтаксис в CPP

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; 

Я не могу понять, почему, если я заменю их три правила, левая рекурсия, я просто добавляю лямбда к этим правилам

 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

Нет lambda или левая рекурсия.

Когда вы добавляете epsilon в правила if (что делает необязательным), вы получаете конфликты, потому что результирующая грамматика неоднозначна. Это классическая неопределенность, когда у вас есть TWO ifs с одним другим, else может связываться с if if.

IF (expr1) IF (expr2) block1 ELSE block2 
Смежные вопросы