Повисшая еще грамматика для Лекса и Яка

Я пишу небольшой синтаксический анализатор для распознавания подмножества 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;
   }

0 ответов

Другие вопросы по тегам