我必须将这个EBNF翻译成野牛:
<compound-statement> ::= begin [ <statement> ( ; <statement> )*] end
<statement> ::=
| <assignment>
| <if-statement>
| <while-statement>
| <proc-func-call>
| <compound-statement>
当我翻译assignement时,if,while语句和proc_func_在野牛中没有错误。但是,当我在野牛中键入它时,翻译复合语句:
compound_statement : BEGINKEY state ENDKEY ;
state : | statement stm ;
stm : | BQUESTIONMARK statement stm ;
存在减少/减少错误。
有人可以向我解释,为什么会出现减少/减少错误,因为它对我没有意义。我真的很感激。
提前致谢。
答案 0 :(得分:0)
所以你有一个Pascal-ish语言,分号是一个语句分隔符,而不是终结符。
我认为BQUESTIONMARK
是分号的标记(“;”)。
我认为你最好用一个需要第一个语句的制作,然后另一个左递归制作提供 可选的附加声明。
我可能会误读某些内容,但你的语法允许state
为epsilon(null)以及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 ;