我可以对Lexial元素进行一次检查,而不是对许多语法分析器规则进行检查吗



我正在尝试将antlr4与IDL.g4语法一起使用,以实现我们的IDL文件应该遵循的一些检查。一条规则是关于名字的。规则如下:

  • ID仅包含字母、数字和有符号下划线
  • ID以字母开头
  • ID以字母或数字结尾
  • ID不是ADA、C、C++、Java、IDL中的保留字

执行此检查的一种方法是编写一个函数,该函数检查字符串中的这些属性,并在出口侦听器中为每个在exitConst_decl()exitInit_decl()exitSimple_declarator()等位置具有ID.E.g(参考IDL.g4)的规则调用它。也许这是正确的方法。但我想直接对词法元素ID进行检查。但不知道如何做到这一点,或者这是否可能。

在lexer中验证这种类型的约束将大大增加为无效标识符提供可用错误消息的难度。但是,您可以创建一个新的解析器规则identifier,并将各种解析器规则中对ID的所有引用替换为引用identifier

identifier
  : ID
  ;

然后,您可以将标识符验证逻辑放置在单个方法enterIdentifier中,而不是当前引用ID的所有各种规则中。

最新更新