ANTLR4特定搜索

ANTLR4特定搜索,antlr4,Antlr4,基本上,我想在文件中使用ANTLR查找定义的每个表达式: 一字不差 例如:“结束。开始”匹配 目前,该文件可以有成百上千行和复杂的结构 是否有一种方法可以跳过与上述模式不匹配的所有内容(字符?),而不生成完全表示文件的语法 到目前为止,这是我的语法,但我不知道下一步该怎么办 grammar Dep; program : dependencies ; dependencies : ( dependency )*

基本上,我想在文件中使用ANTLR查找定义的每个表达式:

一字不差

例如:“结束。开始”匹配

目前,该文件可以有成百上千行和复杂的结构

是否有一种方法可以跳过与上述模式不匹配的所有内容(字符?),而不生成完全表示文件的语法

到目前为止,这是我的语法,但我不知道下一步该怎么办

 grammar Dep;

program
    : 
       dependencies
    ;

dependencies
    :
      (
       dependency
      )*
    ;

dependency
    :
      identifier
      DOT
      identifier
    ;

identifier
    :
      INDENTIFIER
    ;

DOT     : '.'       ;

INDENTIFIER
  :
    [a-zA-Z_] [a-zA-Z0-9_]*
  ;

OTHER
  :
    . -> skip
  ;

按照您现在的操作方式,
依赖关系
规则还将匹配输入中的标记
'end'
'start'

end
#####
.
#####
beginning
因为正在从令牌流中跳过换行符和
“#”
s

如果这不是您想要的,即您想要匹配
“end.start”
,而中间没有任何字符,那么您应该为它创建一个lexer规则,并在解析器中匹配该规则:

grammar Dep;

program
 : DEPENDENCY* EOF
 ;

DEPENDENCY
 : [a-zA-Z_] [a-zA-Z0-9_]* '.' [a-zA-Z_] [a-zA-Z0-9_]*
 ;

OTHER
 : . -> skip
 ;
然后,您可以使用a对您的
依赖项
执行一些有用的操作:

公共类主{
公共静态void main(字符串[]args)引发异常{
字符串输入=“####end.start#######foo.bar mu foo.x”;
解复用器lexer=新的解复用器(新的AntlInputStream(输入));
DepParser=newdepparser(newcommontokenstream(lexer));
ParseTreeWalker.DEFAULT.walk(新的DepBaseListener(){
@凌驾
public void enterProgram(@NotNull DepParser.ProgramContext ctx){
对于(TerminalNode节点:ctx.DEPENDENCY()){
System.out.println(“node=“+node.getText());
}
}
},parser.program());
}
}
将打印:

node=end.beginning node=foo.bar node=foo.x node=end.start node=foo.bar node=foo.x