ANTLR4特定搜索

时间:2014-06-03 15:52:55

标签: antlr4

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

WORD.WORD

例如:“end.beginning”匹配

目前该文件可能有数百行和一个复杂的结构。

有没有办法跳过与上述模式不匹配的所有事物(字符?),而没有制作完全代表文件的语法?

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

 grammar Dep;

program
    : 
       dependencies
    ;

dependencies
    :
      (
       dependency
      )*
    ;

dependency
    :
      identifier
      DOT
      identifier
    ;

identifier
    :
      INDENTIFIER
    ;

DOT     : '.'       ;

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

OTHER
  :
    . -> skip
  ;

1 个答案:

答案 0 :(得分:1)

您现在的做法是,dependency规则还会匹配来自输入的令牌'end''.''beginning'

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

因为正在从令牌流中跳过换行符和'#'

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

grammar Dep;

program
 : DEPENDENCY* EOF
 ;

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

OTHER
 : . -> skip
 ;

然后你可以使用tree listener对你的DEPENDENCY做一些有用的事情:

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());
  }
}

会打印:

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