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()
}
我有一个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()
}