2015-04-11 2 views
0

Я пытаюсь разобрать выражения типа he did [something called :action], где действие является переменной, а скобки подразумевают, что блок является необязательным. Если одна из переменных внутри скобок отсутствует, тогда мне нужно заменить весь блок на заполнитель, например nothing.Анализ простого шаблона с Antlr4

Я думаю, что логическая часть проста, потому что я знаком с механизмом посетителя, но я не мог разобрать строки.

Я попробовал следующий синтаксический анализатор, но он генерирует узел ошибок вместо optionalParameter. Я не мог найти проблему, может ли кто-нибудь взглянуть на этот скрипт разбора и рассказать мне, что я делаю неправильно?

grammar NamedParam; 

query: (QUERY_CONTENT optionalParameter)*; 

optionalParameter: '[' (STRING namedParameter)* ']'; 

namedParameter: ':' IDENTIFIER; 

IDENTIFIER 
    : (ALPHANUMERIC)+; 

fragment ALPHANUMERIC 
    : [A-Za-z0-9]; 

STRING : ~(':' | ']')* ; 
QUERY_CONTENT : ~('[')* ; 

ответ

1

Ваше понимание ANTLR разборе кажется неполным:

ANTLR синтаксический строго предваряется ANTLR Lexing. На этапе лексики полный текст обозначается, не зная правил синтаксического анализа. Правило, как генерировать токен:

  • предпочитает самый длинный маркер
  • в случае двух матчей с одинаковой длиной предпочитает первый определенный маркер

У вас есть три маркеров типа (я предполагаю, что там является дополнительным правилом пробелов):

he did [something called (-> STRING) 
: (-> ':') 
action] (-> QUERY_CONTENT) 

Что вы хотите: парсер должен контролировать, какое правило маркера должно применяться.

he did (->QUERY_CONTENT) 
... 

, но это не удается, потому что существует больше токенов матч he did [something called.

Избегайте маркеров, которые другие маркеры подводить

  • Добавление (не алфавитно-цифровой символ) (даже пробела), который не : или ] к ИДЕНТИФИКАТОР и делает полученный маркер в строку.
  • Добавление символа, который не [ к STRING делает полученный токен к QUERY_CONTENT

Иногда нельзя избежать, но это вызывает постоянный риск жестких понятных ошибок синтаксического анализа.

Как решить эту проблему:

  • переписать грамматику, чтобы соответствовать концепции ANTLR (это, вероятно, очень трудно достичь, если вы хотите сохранить этот синтаксис)
  • точного синтаксиса языка (более ограничивающие символы, не относящиеся к токенам)
  • использовать ПЭГ-парсер (парил, крысы). Эти типы парсеров очень близки к вашему пониманию.
Смежные вопросы