Antlr中是否有机制允许lexer仅在特定规则期间匹配令牌?

Antlr中是否有机制允许lexer仅在特定规则期间匹配令牌?,antlr,lexer,Antlr,Lexer,我想在我的语言中添加一个关键字 在一个特定的解析器语法规则期间,只需匹配该关键字 由于向后兼容性,我希望允许这个关键字继续用作变量名,即它可以由lexer规则匹配,该规则确定令牌是否适合变量名 每当在文件中找到新规则时,Lexer都会匹配它 修改var_声明规则以使其匹配IDENT或新的关键字标记是否是解决此问题的适当方法? protected modified_var_declaration: VAR (IDENT|KEYWORD); ; 有关规则如下: IDENT // ma

我想在我的语言中添加一个关键字

在一个特定的解析器语法规则期间,只需匹配该关键字

由于向后兼容性,我希望允许这个关键字继续用作变量名,即它可以由lexer规则匹配,该规则确定令牌是否适合变量名

每当在文件中找到新规则时,Lexer都会匹配它

修改var_声明规则以使其匹配IDENT或新的关键字标记是否是解决此问题的适当方法?

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
    : IDENT
    | KEYWORD
    ;
看看哪个能帮你解决问题。当允许“关键字”时,您需要设置和取消设置一个标志,即

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

这里的诀窍是在您可以期望关键字的位置进行切换,这可能不那么简单。

使用这种方法,错误消息就不那么有用了(除了标识或关键字之外)