Antlr中是否有机制允许lexer仅在特定规则期间匹配令牌?
我想在我的语言中添加一个关键字 在一个特定的解析器语法规则期间,只需匹配该关键字 由于向后兼容性,我希望允许这个关键字继续用作变量名,即它可以由lexer规则匹配,该规则确定令牌是否适合变量名 每当在文件中找到新规则时,Lexer都会匹配它 修改var_声明规则以使其匹配IDENT或新的关键字标记是否是解决此问题的适当方法?Antlr中是否有机制允许lexer仅在特定规则期间匹配令牌?,antlr,lexer,Antlr,Lexer,我想在我的语言中添加一个关键字 在一个特定的解析器语法规则期间,只需匹配该关键字 由于向后兼容性,我希望允许这个关键字继续用作变量名,即它可以由lexer规则匹配,该规则确定令牌是否适合变量名 每当在文件中找到新规则时,Lexer都会匹配它 修改var_声明规则以使其匹配IDENT或新的关键字标记是否是解决此问题的适当方法? protected modified_var_declaration: VAR (IDENT|KEYWORD); ; 有关规则如下: IDENT // ma
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";
这里的诀窍是在您可以期望关键字的位置进行切换,这可能不那么简单。使用这种方法,错误消息就不那么有用了(除了标识或关键字之外)