我正在尝试创建自己的分析器/解析器。
我有一个问题,我理解它为什么不起作用,但我不确定如何解决它。
这是我的解析器问题部分的代码。
void Expression() : {}{
Term() ((<PLUS> | <MINUS>) Term())*
}
void Term() : {}{
Factor()((<MULTIPLY> | <DIVIDE>) Factor())*
}
void Factor() : {}{
(<ID> | <NUMBER> | ((<PLUS> | <MINUS>)?<OPEN_PARENTHESIS> Expression() <CLOSE_PARENTHESIS>))
}
void Condition() : {}{
(
(<NOT> Condition()) |
(<OPEN_PARENTHESIS> Condition() (<AND> | <OR>) Condition() <CLOSE_PARENTHESIS>) |
(Expression() (<EQUAL_CHECK> | <NOT_EQUAL> | <LESS> | <LESS_EQUAL> | <GREATER> | <GREATER_EQUAL>) Expression())
)
}
如您所见,问题来自OR 部分中三个选项中最后两个选项的Condition()方法。这是因为Expression()最终会变成“( Expression() )”,因此第三个和第二个选项都可以以左括号标记开头。
但是,我不确定如何解决这个问题。我之前在解析器中解决了一个类似的问题,但是由于Expression() --> Term() --> Factor()的方式和问题代码都是在Factor()方法中。
任何建议将不胜感激。
谢谢,
托马斯。
编辑:
有关更多信息,我将提供应该与此解析器一起使用但不会由于上述错误而导致的代码示例。
fun succesful_method()
start
var i = 1;
if(i > 0 and i < 2)
do
i = 2;
stop
stop
start
successful_method()
stop
上述方法将成功运行,因为它使用了Condition()方法的第二种替代方法。
fun succesful_method()
start
var i = 1;
if(i > 0)
do
i = 2;
stop
stop
start
successful_method()
stop
上述方法将失败,因为它需要使用第三种替代方法,但是由于 '(' 导致解析器调用第二种替代方法,它无法访问它。