不确定到底是什么原因导致了这种情况。当我试图编译该文件时,我收到一个错误,说"左递归检测到表达式…->片段…->表达式.
有这个的代码区域是这个部分
void statement() : {}
{
identifier() <ASSIGN> expression()
| identifier() <ASSIGN> <STRING>
| <EMARK> expression()
| <QMARK> identifier()
| identifier(arg_list())
| <BEGIN>(statement() <SEMIC>)+ <END>
| <IF> condition() <THEN> statement()
| <IF> condition() <THEN> statement() <ELSE> statement()
| <WHILE> (condition()) <DO> statement()
| {}
}
void expression () : {}
{
fragment()((<PLUS_SIGN> | <MINUS_SIGN> | <MULT_SIGN> | <DIV_SIGN>) fragment())*
}
void fragment () : {}
{
identifier() | <NUM> | (<PLUS_SIGN> | <MINUS_SIGN>)fragment() | expression()
}
我真的不知道该如何解决这个问题,如果有任何帮助,我将不胜感激!谢谢
void fragment() #void : {}
|<LBR> expression() <RBR>
更改片段生成规则,在该规则中,表达式的两边都要包含方括号。这应该可以解决递归问题。
我认为您的抽象有点偏离。
(<PLUS_SIGN> | <MINUS_SIGN>)fragment()
更像是一种可以否定片段的表达
我会考虑
void expression () : {}
{
fragment()((<PLUS_SIGN> | <MINUS_SIGN> | <MULT_SIGN> | <DIV_SIGN>) fragment())*
| <MINUS_SIGN> fragment()
| <PLUS_SIGN> fragment()
}
我也相信片段不需要是expression()
,递归已经被((<PLUS_SIGN> | <MINUS_SIGN> | <MULT_SIGN> | <DIV_SIGN>) fragment())*
封装,能够重复