В ANTLR4 У меня есть правило lexer, в котором говорится, что я могу получить любое слово, используя любой символ, но пробелы и разрывы строк. Она определяется как это:Устранение двусмысленностей Lexer и Parser в ANTLR4
WORD : ~[ \t\r\n:,]+;
У меня также есть правила лексического анализатора (определяется, прежде чем WORD) для выезда в режим EVAL:
OPENEVAL : '${' -> pushMode(EVAL);
mode EVAL;
CLOSEEVAL : '}' -> popMode;
... (more lexer definitions for EVAL mode) ...
В файле анализатора я пытаюсь обнаруживать правило грамматики ИЛИ слово. Поэтому я делаю следующее:
eval : evaluation
| WORD;
evaluation : OPENEVAL somestuff CLOSEEVAL;
somestuff использует правила LeXeR, определенные в режиме EVAL. Проблема заключается в том, что при оценке правила eval он идентифицирует текст как токен WORD, а не как правило грамматики оценки. Я имею в виду, если я вхожу в какой-то текст, как:
${stuff to be evaluated}
Он должен пойти в оценки правила, но вместо этого, он идентифицирует его как WORD (принимая «$ {вещи» часть только)
Я знаю, что существует неопределенность между оценкой и WORD, но я думал, что ANTLR собирается принять первое совпадение правила синтаксического анализа (оценка в этом случае).
Извините, если это слишком запутанно, я попытался подвести итог этому как можно лучше (я не хотел ставить полный синтаксический анализатор и содержание лексера, чтобы избежать стены текста в основном).
Другой вариант, который я рассматривал, заключался в том, чтобы определить «СЛОВО» как что-либо, кроме текста, окруженного $ {и}. Но я не знаю, как создать такое правило lexer.
Как я могу это решить? Различия между оценкой и WORD?
Вау, я не знал о предикатах ... отлично работает. Но этот код только помешал бы мне распознавать слова, начинающиеся с «$ {», но не окруженные «$ {" ... "}" правильно? – Pnikosis