Есть ли в Antlr механизм, позволяющий лексеру сопоставлять токен только во время определенных правил?
Вопрос
Я хотел бы добавить ключевое слово на мой язык.
Это ключевое слово должно быть найдено только во время одного конкретного правила грамматики синтаксического анализатора.
Из-за обратной совместимости я бы хотел, чтобы это ключевое слово продолжало использоваться в качестве имени переменной, то есть ему может соответствовать правило лексера, определяющее, подходит ли токен для имени переменной. Р>
Lexer соответствует новому правилу всякий раз, когда оно найдено в файле. Р>
Правильный ли способ обойти это, чтобы изменить правило var_declaration, чтобы оно соответствовало либо IDENT, либо новым токенам KEYWORD?
protected
modified_var_declaration:
VAR (IDENT|KEYWORD);
;
Соответствующие правила:
IDENT // matches variable names
options { testLiterals=true; }
: ( '_' | 'a'..'z' | 'A'..'Z' ) ( '_' | 'a'..'z' | 'A'..'Z' | DIGIT )*
;
KEYWORD: // my new keyword
"key"
;
Правило синтаксического анализа для создания переменной:
protected
var_declaration:
VAR IDENT;
;
Решение
Многие языки имеют контекстно-зависимые ключевые слова. Первым шагом к их обработке является добавление нового правила синтаксического анализатора идент
, представляющего имя переменной. Используйте это правило в вашем парсере вместо IDENT
.
ident
: IDENT
| KEYWORD
;
Другие советы
Ознакомьтесь с http://www.antlr.org/wiki/display /ANTLR3/1.+Lexer , который должен вам помочь. Вам нужно будет установить и снять флаг, когда " KEYWORD " будет разрешено, т.е.
KEYWORD : { keywordcontext }?=> "key";
Хитрость здесь заключается в том, чтобы переключаться туда, где вы можете ожидать ключевое слово, которое может быть менее тривиальным.