从JavaCC

时间:2017-07-04 19:15:27

标签: javacc

假设我们有生产规则表达式,可以选择 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成为生产规则的一部分?

1 个答案:

答案 0 :(得分:0)

没有。没有一种简单的方法来匹配与模式X匹配的所有内容,除了那些与模式Y匹配的内容。

但那不是你的问题。您的问题似乎是您要解析表达式。有一种直截了当的方法。

void Expression() #void: {}
{
    LOOKAHEAD(LogicExpression())
    LogicExpression()
|
    LOOKAHEAD(MathExpression())
    MathExpression()
| 
    LOOKAHEAD(StringExpression())
    StringExpression()
|
    ListExpression()
}

对于可以通过多个选项匹配的输入,可以选择的第一个选择。