2012-06-20 2 views
0

я должен перевести эту EBNF на зубр:EBNF к Bison - свёртка/свёртка ошибки

<compound-statement> ::= begin [ <statement> (; <statement>)*] end 

<statement> ::= 
| <assignment> 
| <if-statement> 
| <while-statement> 
| <proc-func-call> 
| <compound-statement> 

, когда я перевести присваивания, если, в то время как заявления и proc_func_ нет ошибок в зубре. Однако, когда я набираю это в бизоне, перевод составного оператора:

compound_statement : BEGINKEY state ENDKEY ; 
state : | statement stm ; 
stm : | BQUESTIONMARK statement stm ; 

есть ошибка уменьшения/уменьшения.

Может кто-нибудь объяснить мне, почему возникает ошибка уменьшения/уменьшения, потому что это не имеет смысла для меня. Я был бы очень признателен.

Заранее спасибо.

+0

Что такое 'BQUESTIONMARK'? – templatetypedef

ответ

0

Итак, у вас есть язык Pascal-ish, где точка с запятой является разделителем операторов, а не терминатором.

Я предполагаю, что BQUESTIONMARK - ваш токен для точки с запятой (";").

Я думаю, что вы сделаете все возможное с одним производством, для которого требуется первый оператор, а затем еще одна леворекурсивная продукция, которая предусматривает дополнительные дополнительные инструкции для .

Я может быть что-то неправильное, но ваша грамматика позволяет state быть эпсилон (нуль), а также stm, и я думаю, что это источник вашего снижения/уменьшения ошибки.

Я хотел бы решить эту проблему так:

compound_statement : BEGINKEY first_statement statements ENDKEY 
        | BEGINKEY first_statement ENDKEY 
        ; 

first_statement : statement ; 

statement : assignment 
      | if_statement 
      | while_statement 
      | proc_func_call 
      | compound_statement 
      ; 

statements : statements statement_with_semi 
      | statement_with_semi 
      ; 

statement_with_semi : BQUESTIONMARK statement ; 

 Смежные вопросы

  • Нет связанных вопросов^_^