Есть ли в Antlr механизм, позволяющий лексеру сопоставлять токен только во время определенных правил?

StackOverflow https://stackoverflow.com/questions/1620011

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top