Есть ли в Antlr механизм, позволяющий лексеру сопоставлять токен только во время определенных правил? - PullRequest
1 голос
/ 25 октября 2009

Я хотел бы добавить ключевое слово на мой язык.

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

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

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 ]

2 голосов
/ 25 октября 2009

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

ident
    : IDENT
    | KEYWORD
    ;
0 голосов
/ 03 декабря 2012

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

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

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

...