JavaCC - 基于返回类型的选择?

时间:2017-05-10 13:56:15

标签: javacc

我有一个ifElse语句,可以是以下两种类型

a)ifElse(condition,expression_bool_result,expression_bool_result)

而expression_bool_result可能是TRUE / FALSE,结果是和(),或(),==,!= ....或者进一步ifElse

b)ifElse(condition,expression_arith_result,expression_arith_result)

而expression_arith_result可以是任何数字,计算返回数字的其他函数的结果......(或进一步ifElse)

由于我是javacc的新手,我想问一下生产如何能让解析器做出明确的决定。

目前我收到警告

Warning: Choice conflict involving two expansions at
line 824, column 5 and line 825, column 5 respectively.
A common prefix is: "ifElse" "("
Consider using a lookahead of 3 or more for earlier expansion.

- 据我所知 - 暗示我的语法(关于ifelse)是模棱两可的。

如果没有办法明确地写出来,建议的前瞻怎么样?

感谢您的反馈意见!

2 个答案:

答案 0 :(得分:0)

在所有情况下,没有固定数量的前瞻可能解决这种歧义。您可以拥有一个任意长的令牌流,形成一个有效的expression_arith_result - 然后是一个比较运算符和另一个算术值,从而将其转换为expression_bool_result

解决方案是使用单个ifElse语句,该语句采用两个任意表达式。两个表达式之间所需的类型协议将是语义问题,而不是语法。

答案 1 :(得分:0)

Jason的回答是正确的,因为你无法用固定长度的前瞻来解决这个问题。但是,JavaCC并不限制您使用前瞻性的固定长度。所以你可以做到以下几点。

void IfExpression() :
{ }
{ LOOKAHEAD( <IFELSE> "(" Condition() "," BooleanExpression() )
  BooleanIfExpression()
|
  ArithmeticIfExpression()
}