Using ANTLR to parse a log file

前端 未结 1 600
攒了一身酷
攒了一身酷 2021-01-01 02:18

I\'m just about starting with ANTLR and trying to parse some pattern out of a log file

for example: log file:

7114422 2009-07-16 15:43:07,078

1条回答
  •  时光说笑
    2021-01-01 02:52

    When you're only interested in a part of the file you're parsing, you don't need a parser and write a grammar for the entire format of the file. Only a lexer-grammar and ANTLR's options{filter=true;} will suffice. That way, you will only grab the tokens you defined in your grammar and ignore the rest of the file.

    Here's a quick demo:

    lexer grammar TestLexer;
    
    options{filter=true;}
    
    @lexer::members {
      public static void main(String[] args) throws Exception {
        String text = 
            "7114422 2009-07-16 15:43:07,078 [LOGTHREAD] INFO StatusLog - Task 0 input : uk.project.Evaluation.Input.Function1(selected=[\"red\",\"yellow\"]){}\n"+
            "\n"+
            "7114437 2009-07-16 15:43:07,093 [LOGTHREAD] INFO StatusLog - Task 0 output : uk.org.project.Evaluation.Output.Function2(selected=[\"Rocket\"]){}\n"+
            "\n"+
            "7114422 2009-07-16 15:43:07,078 [LOGTHREAD] INFO StatusLog - Task 0 input : uk.project.Evaluation.Input.Function3(selected=[\"blue\",\"yellow\"]){}\n"+
            "\n"+
            "7114437 2009-07-16 15:43:07,093 [LOGTHREAD] INFO StatusLog - Task 0 output : uk.org.project.Evaluation.Output.Function4(selected=[\"Speech\"]){}";
        ANTLRStringStream in = new ANTLRStringStream(text);
        TestLexer lexer = new TestLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        for(Object obj : tokens.getTokens()) {
            Token token = (Token)obj;
            System.out.println("> token.getText() = "+token.getText());
        }
      }
    }
    
    Input
      :  'Evaluation.Input.Function' '0'..'9'+ Params   
      ;
    
    Output
      :  'Evaluation.Output.Function' '0'..'9'+ Params
      ;
    
    fragment
    Params
      :  '(selected=[' String ( ',' String )* '])'
      ;
    
    fragment
    String
      :  '"' ( ~'"' )* '"'
      ;
    

    Now do:

    javac -cp antlr-3.2.jar TestLexer.java
    java -cp .:antlr-3.2.jar TestLexer // or on Windows: java -cp .;antlr-3.2.jar TestLexer
    

    and you'll see the following being printed to the console:

    > token.getText() = Evaluation.Input.Function1(selected=["red","yellow"])
    > token.getText() = Evaluation.Output.Function2(selected=["Rocket"])
    > token.getText() = Evaluation.Input.Function3(selected=["blue","yellow"])
    > token.getText() = Evaluation.Output.Function4(selected=["Speech"])
    

    0 讨论(0)
提交回复
热议问题