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

StackOverflow https://stackoverflow.com/questions/1620011

  •  06-07-2019
  •  | 
  •  

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

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

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

只要在文件中找到新规则,词法分析器就会匹配新规则。

解决此问题的适当方法是修改 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";

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top