2009-10-25 3 views
1

Я хотел бы добавить ключевое слово на мой язык.Есть ли механизм в Antlr, чтобы лексер мог сопоставлять токен только во время определенных правил?

Это ключевое слово должно соответствовать только одному правилу грамматики парсера.

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

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; 
; 

ответ

2

Многие языки имеют контекстные ключевые слова. Первым шагом к их обработке является добавление нового правила парсера ident, представляющего имя переменной. Используйте это правило в своем парсере вместо IDENT.

ident 
    : IDENT 
    | KEYWORD 
    ; 
+0

хорошо работает для меня. – chollida

0

Отъезд http://www.antlr.org/wiki/display/ANTLR3/1.+Lexer, который должен помочь вам. Вам нужно будет установить и снят с охраной, когда флаг «СЛОВО» будет разрешено, то есть

KEYWORD : { keywordcontext }?=> "key"; 

трюк здесь будет переключаясь, где вы можете ожидать, ключевое слово, которое может быть меньше, чем тривиальная.

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

  • Нет связанных вопросов^_^