我有一个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)是模棱两可的。
如果没有办法明确地写出来,建议的前瞻怎么样?
感谢您的反馈意见!
答案 0 :(得分:0)
在所有情况下,没有固定数量的前瞻可能解决这种歧义。您可以拥有一个任意长的令牌流,形成一个有效的expression_arith_result
- 然后是一个比较运算符和另一个算术值,从而将其转换为expression_bool_result
。
解决方案是使用单个ifElse
语句,该语句采用两个任意表达式。两个表达式之间所需的类型协议将是语义问题,而不是语法。
答案 1 :(得分:0)
Jason的回答是正确的,因为你无法用固定长度的前瞻来解决这个问题。但是,JavaCC并不限制您使用前瞻性的固定长度。所以你可以做到以下几点。
void IfExpression() :
{ }
{ LOOKAHEAD( <IFELSE> "(" Condition() "," BooleanExpression() )
BooleanIfExpression()
|
ArithmeticIfExpression()
}