我正在尝试使用ANLTR语法对语言进行建模。一个功能是"可以默认下一个X参数"。从语法上看,它看起来如下:考虑
f(a=1, b=2, c=3, d=4, e=5)
f是具有5个参数a、b、c、d和e的函数,其默认值分别为1、2、3、4、5。该语言允许用户通过如下指定"默认下一个X参数":
f(2, 3#, 10)
这里的函数f是在a=2,b/c/d=default和e=10的情况下调用的。因此,它相当于
f(2, 2, 3, 4, 10)
ANTLR4中是否有可以"跳过下一个X解析器树元素"的功能?语法上的ANTRL4模型看起来有点像
INT: [0-9]+;
DEFAULT: INT'*';
STRING; // shortened
parameter: INT | DEFAULT_VALUE ((INT | DEFAULT_VALUE) ',')*
functionCall: STRING '(' parameter* ')'
当我解析functionCall令牌时,我想解析DEFAULT_value的值,然后简单地跳过解析下一个DEFAULT.value.INT((令牌。
生成的树看起来像
- 函数调用
- 参数1(2(
- 参数5(10(
而不是
- 函数调用
- 参数1(2(
- 默认值(3(
- 参数5(10(
或
- 函数调用
- 参数1(2(
- 参数2(2(
- 参数3(3(
- 参数4(4(
- 参数5(10(
另一个解决方案是简单地对DEFAULT_VALUE进行建模。在解析器树中,我可以忽略下一个函数参数。然而,在从解析器树模型到对象模型的转换过程中,这种解决方案将导致大量的额外代码。
您不需要单独的函数。您可以通过不访问给定上下文的子节点来忽略它们。如何走解析树取决于您。