假设我们有生产规则表达式,可以选择 LogicExpression , MathExpression , StringExpression ,以及的 ListExpression
void Expression() #void: {}
{
LOOKAHEAD(3) LogicExpression() | LOOKAHEAD(3) MathExpression() |
LOOKAHEAD(2) StringExpression() | ListExpression()
}
所有这四个生产规则都可以评估为令牌IDENTIFIER,因此表达式IDENTIFIER + 1将遇到ParseException,因为IDENTIFIER解析为 LogicExpression 而不是整个解析为 MathExpression 即可。有没有办法排除单独的IDENTIFIER成为生产规则的一部分?
答案 0 :(得分:0)
没有。没有一种简单的方法来匹配与模式X匹配的所有内容,除了那些与模式Y匹配的内容。
但那不是你的问题。您的问题似乎是您要解析表达式。有一种直截了当的方法。
void Expression() #void: {}
{
LOOKAHEAD(LogicExpression())
LogicExpression()
|
LOOKAHEAD(MathExpression())
MathExpression()
|
LOOKAHEAD(StringExpression())
StringExpression()
|
ListExpression()
}
对于可以通过多个选项匹配的输入,可以选择的第一个选择。