Antlr中是否有一种机制允许词法分析器仅在某些规则期间匹配令牌?

时间:2009-10-25 04:31:54

标签: antlr lexer

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

此关键字只需在一个特定的解析器语法规则中匹配。

由于向后兼容性,我希望允许此关键字继续用作变量名,即可以通过词法分析器规则来匹配,该规则确定令牌是否适合变量名。

只要在文件中找到新规则,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 个答案:

答案 0 :(得分:2)

许多语言都有上下文相关的关键字。处理它们的第一步是添加表示变量名称的新解析器规则ident。在解析器中使用该规则而不是IDENT

ident
    : IDENT
    | KEYWORD
    ;

答案 1 :(得分:0)

查看http://www.antlr.org/wiki/display/ANTLR3/1.+Lexer哪个可以帮到你。当允许“KEYWORD”时,你需要设置和取消设置一个标志,即

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

这里的诀窍是切换你可以期待关键字的位置,这可能不是那么简单。