1

在我的语法中,函数参数不是强制性的,例如:

foo(param1,,, param4) //有效

考虑到这个语法:

expressionlist
     :  COMMA* expression?
     (COMMA expression?) *
     ;

在我的侦听器中,上下文数组只有两个元素。

@ Override public void exitExpressionList (ExpressionListContext ctx) {
ctx.expression (0). getText () / / Retuns "param1"
ctx.expression (1). getText () / / Retuns "param4"
}

我想知道我有四个参数,它们的顺序是:

ctx MyArryList ... (0) / / Retuns "param1"
ctx MyArryList ... (1) / / EMPTY 
ctx MyArryList ... (2) / / EMPTY 
ctx MyArryList ... (3) / / Retuns "param4"

当我找到逗号时,可以添加上下文白色吗?

谢谢

4

1 回答 1

3

您可以通过确保省略的参数仍然出现在解析树中来跟踪这一点。请注意,如果您希望它起作用,您必须使用COMMA不是 COMMA*在规则中。

expressionList
  : (COMMA optionalExpression)*
  ;

optionalExpression
  : expression?
  ;

然后在您的访问者中,您可以使用以下内容:

public void exitExpressionList(ExpressionListContext ctx) {
  ExpressionContext firstArgument = ctx.optionalExpression(0).expression();
  boolean omittedFirst = firstArgument == null;
}
于 2013-07-20T01:03:20.997 回答