【问题标题】:Using ANTLR to parse a log file使用 ANTLR 解析日志文件
【发布时间】:2011-01-17 15:22:51
【问题描述】:

我只是从 ANTLR 开始并尝试从日志文件中解析一些模式

例如:日志文件:

7114422 2009-07-16 15:43:07,078 [LOGTHREAD] 信息状态日志 - 任务 0 输入 : uk.project.Evaluation.Input.Function1(selected=["red","yellow"]){}

7114437 2009-07-16 15:43:07,093 [LOGTHREAD] 信息状态日志 - 任务 0 输出 : uk.org.project.Evaluation.Output.Function2(selected=["Rocket"]){}

7114422 2009-07-16 15:43:07,078 [LOGTHREAD] 信息状态日志 - 任务 0 输入 : uk.project.Evaluation.Input.Function3(selected=["blue","yellow"]){}

7114437 2009-07-16 15:43:07,093 [LOGTHREAD] 信息状态日志 - 任务 0 输出 : uk.org.project.Evaluation.Output.Function4(selected=["Speech"]){}

现在我必须解析这个文件,只找到'Evaluation.Input.Function1',它的值是'red'和'yellow'和'Evaluation.Output.Function2'和值'Rocket'并忽略其他所有内容,类似地其他 2 输入和输出功能 3,4 下面。有很多这样的输入和输出函数,我必须找到这样的输入/输出函数集。这是我尝试的语法,但不起作用。任何帮助,将不胜感激。作为我第一次尝试编写语法和 ANTLR,现在变得相当令人生畏..

grammar test;

    tag : inputtag+ outputtag+ ;
//Input tag consists of atleast one inputfunction with one or more values
inputtag:  INPUTFUNCTIONS INPUTVALUES+;

//output tag consists of atleast one ontput function with one or more output values
outputtag : OUTPUTFUNCTIONS OUTPUTVALUES+;

INPUTFUNCTIONS 
 : INFUNCTION1 | INFUNCTION2;

OUTPUTFUNCTIONS
 :OUTFUNCTION1 | OUTFUNCTION2;

// Possible input functions in the log file
fragment INFUNCTION1
 :'Evaluation.Input.Function1';

fragment INFUNCTION2
 :'Evaluation.Input.Function3';

//Possible values in the input functions
INPUTVALUES
 : 'red' | 'yellow' | 'blue';

// Possible output functions in the log file 
fragment OUTFUNCTION1
 :'Evaluation.Output.Function2';

fragment OUTFUNCTION2
 :'Evaluation.Output.Function4';

//Possible ouput values in the output functions
fragment OUTPUTVALUES
 : 'Rocket' | 'Speech';

【问题讨论】:

    标签: antlr


    【解决方案1】:

    当您只对正在解析的文件的一部分感兴趣时,您不需要解析器并为文件的整个格式编写语法。只有词法分析器语法和 ANTLR 的 options{filter=true;} 就足够了。这样,您将只获取您在语法中定义的标记并忽略文件的其余部分。

    这是一个快速演示:

    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
      :  '"' ( ~'"' )* '"'
      ;
    

    现在做:

    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
    

    您会看到控制台打印出以下内容:

    > 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"])
    

    【讨论】:

    • @arkilus,如果“它”不起作用,这不是一个很好的例子,我会假设......但是它确实起作用。它对你不起作用的事实是一个完全不同的故事:)
    • 抱歉,Bart,您的示例实际上运行良好,问题出在我的构建路径上...顺便感谢您在 SO 中对 ANTLR 的出色帮助 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2016-01-31
    • 1970-01-01
    相关资源
    最近更新 更多