想要跳过所有的行注释,除了antlr4语法中的两行注释



我想对IDL.g4语法进行一点扩展,这样我就可以区分以下两个注释//@top-level false//@top-level true,我只想像以前一样跳过所有其他注释。

我试着这样添加top_levelTOP_LEVEL_TRUETOP_LEVEL_FALSE,因为我认为antr4优先于词汇规则混合。

top_level
  : TOP_LEVEL_TRUE
  | TOP_LEVEL_FALSE
  ;
TOP_LEVEL_TRUE
  : '//@top-level true'
  ;
TOP_LEVEL_FALSE
  : '//@top-level false'
  ;
LINE_COMMENT
  : '//' ~('n'|'r')* 'r'? '' -> channel(HIDDEN)
  ;

但是侦听器CCD_ 6从未被调用,所有的评论似乎都被LINE_COMMENT吃掉了。我应该如何组织lexer和解析器规则?

还有一个问题,当到达输入文件的末尾时,我也想得到通知。我该怎么做?我在侦听器类中尝试过finalize()函数,但从未被调用。

更新了完整的示例:

如上所述,我使用这个语法文件:IDL.g4。然后,我通过将解析器规则top_level放在event_header规则的正下方来更新它。Lexer规则正好位于ID规则之上。

这是我的Listener.java文件

class Listener extends IDLBaseListener {
    @Override
    public void enterTop_level(IDLParser.Top_levelContext ctx) {
        System.out.println("Found top-level");
    }
}

这里有一个主程序:IDLCheck.java

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import java.io.FileInputStream;
import java.io.InputStream;
public class IDLCheck {
    public void process(String[] args) throws Exception {
        InputStream is = new FileInputStream("sample.idl");
        ANTLRInputStream input = new ANTLRInputStream(is);
        IDLLexer lexer = new IDLLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        IDLParser parser = new IDLParser(tokens);
        parser.setBuildParseTree(true);
        RuleContext tree = parser.specification();
        Listener listener = new Listener();
        ParseTreeWalker walker = new ParseTreeWalker();
        walker.walk(listener, tree);    
  }
  public static void main(String[] args) throws Exception {
      new IDLCheck().process(args);
  }
}

和一个输入文件:sample.idl

module CommonTypes {
  struct WChannel {
    int w;
    float d;
  }; //@top-level false
  struct EPlanID {
    int kind;
    short index;
  }; //@top-level TRUE
};

我希望看到两次输出"Found top top",但我没有看到

最后我找到了一个解决方案。我只是在TOP_LEVEL_FALSETOP_LEVEL_TRUE lexer规则中添加了换行符,还将top_level解析器规则添加到定义规则中,因为我只希望top_level出现在结构或并集之后。这是对IDL格式的rti.com特定扩展,这个修改对我来说似乎已经足够好了。

definition
  : type_decl SEMICOLON top_level?
  | const_decl SEMICOLON
  ...
TOP_LEVEL_TRUE
  : '//@top-level true' 'r'? 'n'
  ;
TOP_LEVEL_FALSE
  : '//@top-level false' 'r'? 'n'
  ;

相关内容

  • 没有找到相关文章

最新更新