JavaCC - 基于 return 类型的选择?

JavaCC - choice based on return type?

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

a) ifElse(条件, expression_bool_result, expression_bool_result)

而 expression_bool_result 可能是 TRUE/FALSE、and()、or()、==、!=.... 或进一步的 ifElse

的结果

b) ifElse(条件, 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)含糊不清。

如果没有办法明确地写出来,建议的lookahead怎么可能是这样的?

提前感谢您的反馈!

没有固定数量的前瞻可以解决所有情况下的这种歧义。您可以拥有任意长的标记流,这些标记形成有效的 expression_arith_result - 但随后是比较运算符和另一个算术值,从而将其变成 expression_bool_result.

解决方案是使用一个 ifElse 语句,它接受两个任意表达式。两个表达式之间所需的类型一致是语义问题,而不是语法问题。

Jason 的回答是正确的,因为您无法通过固定长度的前瞻来解决选择问题。然而,JavaCC 并不限制您使用固定长度的前瞻。因此,您可以执行以下操作。

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