2012-01-22 4 views
1
NAME: ('a'..'z')+; 
QUOTED_NAME: Q NAME Q; 
Q: '"'; 

name : NAME | QUOTED_NAME; 

для mytext результата является mytextИзменение поведения lexer в Antlr3?

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

Есть ли способ, чтобы рассмотреть Q когда лексическая строку источника, но устранить его, когда результат QUOTED_NAME «s запрашивается? Итак, что мне нужно:

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

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

Пожалуйста, не решение рядного Java

ответ

1

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

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

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

Вы можете дать парсеру создать цитируемое имя, а затем дать синтаксическому анализатору создать 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 

Дополнительная информация о создании АСТ с ANTLR: How to output the AST built using ANTLR?

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