ANTLR4特定搜索

  • 本文关键字:搜索 ANTLR4 antlr4
  • 更新时间 :
  • 英文 :


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

词。词

例如:"end. "开始"匹配

目前文件可能有成百上千行,结构复杂。

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

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

 grammar Dep;
program
    : 
       dependencies
    ;
dependencies
    :
      (
       dependency
      )*
    ;
dependency
    :
      identifier
      DOT
      identifier
    ;
identifier
    :
      INDENTIFIER
    ;
DOT     : '.'       ;
INDENTIFIER
  :
    [a-zA-Z_] [a-zA-Z0-9_]*
  ;
OTHER
  :
    . -> skip
  ;

您现在这样做的方式,dependency规则也将匹配来自输入的令牌'end', '.', 'beginning':

end
#####
.
#####
beginning

,因为从令牌流中跳过了换行符和'#' s。

如果不是你想要的,即你想匹配"end.beginning"之间没有任何字符,你应该做一个单一的词法分析器规则,并在你的解析器中匹配该规则:

grammar Dep;
program
 : DEPENDENCY* EOF
 ;
DEPENDENCY
 : [a-zA-Z_] [a-zA-Z0-9_]* '.' [a-zA-Z_] [a-zA-Z0-9_]*
 ;
OTHER
 : . -> skip
 ;

那么您可以使用树侦听器对DEPENDENCY 's做一些有用的事情:

public class Main {
  public static void main(String[] args) throws Exception {
    String input = "### end.beginning ### end ### foo.bar mu foo.x";
    DepLexer lexer = new DepLexer(new ANTLRInputStream(input));
    DepParser parser = new DepParser(new CommonTokenStream(lexer));
    ParseTreeWalker.DEFAULT.walk(new DepBaseListener(){
      @Override
      public void enterProgram(@NotNull DepParser.ProgramContext ctx) {
        for (TerminalNode node : ctx.DEPENDENCY()) {
          System.out.println("node=" + node.getText());
        }
      }
    }, parser.program());
  }
}

将打印:

<>之前节点= end.beginning节点= foo.bar节点= foo.x

相关内容

  • 没有找到相关文章

最新更新