Использование Antlr 4 У меня есть ситуация, я не уверен, как ее решить. Первоначально я задал вопрос на форуме https://groups.google.com/forum/#!topic/antlr-discussion/1yxxxAvU678 на дискуссионном форуме Antlr. Но этот форум, похоже, не получает большого трафика, поэтому я снова спрашиваю здесь.Семантически неоднозначный двусмысленный синтаксис
У меня есть следующая грамматика:
expression
: ...
| path
;
path
: ...
| dotIdentifierSequence
;
dotIdentifierSequence
: identifier (DOT identifier)*
;
Озабоченность здесь является то, что dotIdentifierSequence
может означать несколько вещей семантически, и не все из них являются «дорожки». Но в настоящий момент все они распознаются как пути в дереве разбора, а затем мне нужно обрабатывать их специально у моего посетителя.
Но я бы очень хотел, это способ выразить dotIdentifierSequence обычаи, которые не являются путями к ним expression
правило, а не в path
правило, и до сих пор dotIdentifierSequence в пути обрабатывать пути использований.
Для того, чтобы быть ясно, A dotIdentifierSequence может быть любым из следующих:
- Путь - это SQL-подобный грамматика и выражение пути будет как таблицы или столбца ссылок в SQL, например,
a.b.c
- Имя класса Java - например.
com.acme.SomeJavaType
- Статическая ссылка на поле Java - например.
com.acme.SomeJavaType.SOME_FIELD
- Ссылка на значение пересылки Java.
com.acme.Gender.MALE
Идея заключается в том, что во время посещения «dotIdentifierSequence как путь» решает, как совершенно другой тип от других использований.
Любая идея, как я могу это сделать?
Ах, я никогда подумал о переносе этого слова в лексер. Хотя это имеет смысл, поскольку на самом деле все они представляют разные типы токенов. Спасибо за изобретательское решение! –
Из вопроса я предположил, что OP уже выполняет такую проверку, чтобы выяснить, является ли такой идентификатор ссылкой на путь или класс/тип и требует другого решения. Btw. с функциональной точки зрения, не имеет значения, если у вас есть эта проверка в синтаксическом анализаторе или в лексере, но наличие в лексере означает: ручное управление пробелами. –