2014-01-06 3 views
2

В 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?

ответ

1

Вам необходимо включить предикат, предотвращающий включение $ в WORD, когда его следует {.

WORD 
    : (~[ \t\r\n:,$] 
    | '$' {_input.LA(1) != '{'}? 
    )+ 
    ; 
+0

Вау, я не знал о предикатах ... отлично работает. Но этот код только помешал бы мне распознавать слова, начинающиеся с «$ {», но не окруженные «$ {" ... "}" правильно? – Pnikosis

Смежные вопросы