ANTLR4: получить тип подтокена - PullRequest
0 голосов
/ 16 апреля 2019

Я создаю парсер для моей грамматики с использованием ANTLR4 и хочу получить тип токена внутри другого токена, если это возможно. Например:

NUMBER_LITERAL
    : INT_LITERAL
    | FLOAT_LITERAL;

когда я хочу построить AST для такого правила, я могу получить, что это NUMBER_LITERAL с использованием Token::getType, но если я тогда захочу решить, является ли это INT_LITERAL или FLOAT_LITERAL, я не могу найти какой-либо способ сделай так.

Возможно ли это, или мне нужно создать правило синтаксического анализатора для NUMBER_LITERAL?

1 Ответ

2 голосов
/ 16 апреля 2019

Токены не имеют под токенов в ANTLR, поэтому нет никакого способа делать то, что вы хотите с токеном. Я также должен отметить, что если NUMBER_LITERAL, INT_LITERAL и FLOAT_LITERAL являются правилами лексера (в отличие от INT_LITERAL и FLOAT_LITERAL являются фрагментами), то либо NUMBER_LITERAL никогда не может совпадать, либо INT_LITERAL и FLOAT_LITERAL никогда не может совпадать, в зависимости от порядка, в котором они определены.

То, что я хотел бы сделать, это иметь INT_LITERAL и FLOAT_LITERAL в качестве токенов, а затем сделать NUMBER_LITERAL правилом синтаксического анализа. Таким образом, вы можете проверить, является ли литерал float или int, либо используя помеченные альтернативы, либо просто проверяя, какой из INT_LITERAL() или FLOAT_LITERAL() не возвращает null.

...