ANTLR 4: как получить правильные аргументы порядка в слушателях

В моей грамматике аргументы функции не являются обязательными, например:

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"

Можно добавить контекст белый, когда запятую нахожу?

Спасибо


person KillerAll    schedule 19.07.2013    source источник


Ответы (1)


Вы можете отследить это, убедившись, что пропущенные аргументы по-прежнему появляются в дереве синтаксического анализа. Обратите внимание, что вы должны использовать COMMA и не COMMA* в правиле, если хотите, чтобы это работало.

expressionList
  : (COMMA optionalExpression)*
  ;

optionalExpression
  : expression?
  ;

Затем в своем посетителе вы можете использовать следующее:

public void exitExpressionList(ExpressionListContext ctx) {
  ExpressionContext firstArgument = ctx.optionalExpression(0).expression();
  boolean omittedFirst = firstArgument == null;
}
person Sam Harwell    schedule 20.07.2013
comment
Это сработало! Спасибо, просто нужно изменить это в грамматике, чтобы принять первый аргумент с допустимым выражением: expressionList : optionalExpression (COMMA optionalExpression)* ; optionalExpression : expression? ; Большое спасибо! - person KillerAll; 20.07.2013