Как проверить, соответствует ли строка в контексте ANTLR? - PullRequest
1 голос
/ 08 марта 2019

Это грамматика ANTLR4:

/* Parser rules */
statement: A '='? B;
/* Lexer rules */
A: ...
B: ...

... соответствует A B и A = B.

Если я сделаю посетителя:

public String visitStatement(StatementContext ctx) {
    ...
}

Как проверить, соответствует ли содержимое A B или A = B (точнее, было ли сопоставлено = или нет)? Я могу сделать это:

ctx.getChild(1).getText().equals("=")

но это кажется слишком хакерским и не работает, если случается, что текст B - "=". Есть ли приемлемый способ сделать это?

1 Ответ

3 голосов
/ 08 марта 2019

Вы можете либо дать токену '=' имя в своей грамматике, либо добавить метку к '='? в этом конкретном правиле.

Именование токена:

statement: A '='? B; // You can write EQ? here or leave it as '='?
/* Lexer rules */
EQ: '=';

Использование метки:

statement: A eq='='? B;

Затем вы можете использовать .EQ() или .eq соответственно для доступа к токену =, которому соответствует данный StatementContext.Если не было =, вы получите null.Таким образом, вы можете использовать ctx.EQ() == null или ctx.eq == null, чтобы проверить, был ли = там или нет.

...