Antlr 中是否有一种机制允许词法分析器仅在某些规则期间匹配令牌?
题
我想为我的语言添加一个关键字。
该关键字只需在一个特定的解析器语法规则期间匹配。
由于向后兼容性,我希望允许此关键字继续用作变量名,即它可以通过词法分析器规则进行匹配,以确定令牌是否适合变量名。
只要在文件中找到新规则,词法分析器就会匹配新规则。
解决此问题的适当方法是修改 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
: IDENT
| KEYWORD
;
其他提示
查看 http://www.antlr.org/wiki/display/ANTLR3/1.+Lexer 这应该可以帮助你。当允许“KEYWORD”时,您需要设置和取消设置一个标志,即
KEYWORD : { keywordcontext }?=> "key";
这里的技巧是切换您可以期待关键字的位置,这可能不是微不足道的。
不隶属于 StackOverflow