antlr4: получить индекс следующего (необязательного) токена - PullRequest
1 голос
/ 08 мая 2020

У меня есть язык с дополнительными предложениями (CL1, CL2).

правило грамматики:
func : FUNC ID "(" (CL1 (ID | CL11 ID))? ")" (CL2 (ID | CL21 ID))? EOS ;

Из-за необязательности я даже не могу использовать getChild(i).getText(), так как «i» становится недетерминированным c.

При генерации кода мне нужно выбрать ID после CL1 или CL2.
Если у меня нет индекса CL1, у меня его нет для ID, который следует за ним.

function fnFoo () meni attrBar ;
будет иметь другие позиции токенов по сравнению с
function fnFoo (arg pBar) meni attrBar ;

Я использовал другой подход:
a. сначала определяется, существует ли токен этого типа ctx.getTokens(LangParser.CL1)[0] или ctx.CL1()
b. выбирая свой токенIndex ctx.CL1().getSymbol().tokenIndex
c. продвижение tokenIndex + 1 к следующему местоположению ID

Но на данный момент я понимаю, что этот tokenIndex не тот индекс, который используется в getChild(i) API.
И нет API для выберите текст токена, используя tokenIndex для начала.

Как бы справиться с этой ситуацией?

ps: Я использую среду выполнения nodejs с посетителями, используя ANTLR 4.8

1 Ответ

2 голосов
/ 08 мая 2020

Как насчет чего-то вроде этого:

func
 : FUNC ID '(' cl1? ')' cl2? EOS 
 ;

cl1
 : CL1 CL11? ID
 ;

cl2
 : CL2 CL21? ID
 ;

В funcContext вы можете сделать:

if (ctx.cl1()) {
   // cl1 is present
   // do something with ctx.cl1().CL1() and/or ctx.cl1().ID()
}
...