Повисшая еще грамматика для Лекса и Яка
Я пишу небольшой синтаксический анализатор для распознавания подмножества Java, и я столкнулся с проблемой, которая, как мне кажется, называется "болтающаяся проблема".
Моя грамматика для сопоставления операторов if-else началась примерно так:
statement:
block |
emptystatement |
ifstatement |
whilestatement |
statementexpression SEMICOLON |
OUTPUT LPAREN addexprlist RPAREN SEMICOLON
;
ifstatement:
IF LPAREN conditionalexpr RPAREN statement |
IF LPAREN conditionalexpr RPAREN statement ELSE statement
Но я получал ошибки сдвига / уменьшения и хотел исправить их, не заглушая их, как большинство рекомендуют.
Я изменил свою грамматику на эту, что избавило от ошибок сдвига / уменьшения, но теперь она неправильно анализирует операторы else.
ifstatement:
matched |
unmatched
;
matched:
IF LPAREN conditionalexpr RPAREN matched ELSE matched
;
unmatched:
IF LPAREN conditionalexpr RPAREN matched |
IF LPAREN conditionalexpr RPAREN unmatched |
IF LPAREN conditionalexpr RPAREN matched ELSE unmatched |
/* empty */
;
Я застрял на этом в течение нескольких дней и не могу понять, как это исправить.
Вот пример чего-то, что должно быть проанализировано:
if( n <= 0 )
output(x);
else { //breaks on this else statement
while( i < 0 ) {
x = input();
sum = sum + x;
++i;
}