1

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

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

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

只要在文件中找到新规则,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;
;
4

2 回答 2

1

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

ident
    : IDENT
    | KEYWORD
    ;
于 2009-10-25T04:36:39.703 回答
1

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

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

这里的诀窍是切换您可以期待关键字的位置,这可能不是微不足道的。

于 2012-12-03T09:42:24.957 回答