Изменение поведения лексера в Antlr3? - PullRequest
1 голос
/ 22 января 2012
NAME: ('a'..'z')+;
QUOTED_NAME: Q NAME Q;
Q: '"';

name : NAME | QUOTED_NAME;

для mytext результат mytext

для "mytext" результат "mytext"

Есть ли способ учесть Q при лексировании исходной строки, но исключить его при запросе результата QUOTED_NAME? Итак, что мне нужно, это:

для mytext результат mytext

для "mytext" результат mytext

Пожалуйста, никаких встроенных Java-решений

1 Ответ

1 голос
/ 22 января 2012

Есть ли способ учесть Q при лексировании исходной строки, но исключить его при запросе результата QUOTED_NAME?

Нет, не без добавления целевого кода (Java или другого).

Но на самом деле я не вижу необходимости: на более позднем этапе вы будете обрабатывать текст из ваших токенов, почему вы не можете удалить кавычки на этом этапе и оставить их там вэтап лексинга?

Вы можете позволить анализатору создать имя в кавычках, а затем позволить анализатору создать AST вместо простого дерева синтаксического анализа.С помощью AST вы можете указать синтаксическому анализатору, какие токены включить (а какие удалить) из AST.Затем вы можете удалить цитаты из вашего дерева.Тем не менее, обработка текста в кавычках - это, скорее, задача, которая принадлежит лексеру.

В любом случае, вот небольшая демонстрация того, как создать AST, который удаляет цитаты из дерева:

grammar Test;

options {
  output=AST;
}

parse
 : name+ EOF -> name+
 ;

name
 : NAME 
 | quoted_name
 ;

quoted_name
 : Q NAME Q -> NAME
 ;

NAME  : ('a'..'z')+;
Q     : '"';
SPACE : ' ' {$channel=HIDDEN;};

который создает следующие AST:

enter image description here

для ввода:

"mytext" mytext

Дополнительная информация о создании AST с помощью ANTLR: Как вывестиAST построен с использованием ANTLR?

...