У меня есть несколько правил Antlr, что я не знаю, как заставить их работатьANTLR неоднозначная грамматика?
Первое правило:
STRING_LITERAL
: '"' (EscapeSequence | ~('\\'|'"'))* '"'
;
Второе правило:
element
: name '=' math_formula ;
math_formula
: '"' expression '"';
Выражение регулярное C-подобное выражение
Пример синтаксиса
"count" = "array[3]"
счетчик должен быть строкой, в то время как массив [3] должен быть выражением
Моя проблема заключается в том, что лексический всегда возвращается как «счетчик» и «массив [3]», как струны, и синтаксический анализатор не может распознать выражение.
Я использую цель java.
EDIT: изменено "variable_name" на "count".
EDIT2: объяснил свою вторую попытку ниже:
я могу обнаружить начало выражения с «=«», но я не буду в состоянии обнаружить конец выражения в Lexer, в результате чего ложное обнаружение строк, когда у меня есть 2 элемента, разделенные «»
"count1" = "array[1]",
"count2" = "array[2]"
, если я использовал «=«», как START_EXPRESSION, лексер обнаружил цитата окончания первого выражения, и цитату, начиная вторую строку в виде string ", \ n", что явно неверно.
EDIT 3: Попытка синтаксических предикатов
Я изменил правила для STRING_LITERAL к
STRING_LITERAL
: (~('=') '"' (EscapeSequence | ~('\\'|'"'))* '"')=> '"' (EscapeSequence | ~('\\'|'"'))* '"'
;
Еще не работает, и я не знаю, как производить ~ (» = ') в самом правиле, присваивая ему метку элемента или somthing
Проблема заключается в том, что выражение является правилом Parser, тогда как STRING является правилом lexer. Что вы описали выше, предполагает, что EXPRESSION является правилом lexer, и это не так. Или я могу понять что-то не так (новичок в ANTLR) – 2009-10-08 17:16:06
Нет, вы правы; Я забыл об этом. Я думаю, что что-то подобное можно сделать на уровне анализатора. Я посмотрю еще немного, когда у меня будет время. – erickson
protected был преобразован в фрагмент в ANTLR v3. –