2010-02-16 62 views
4

我只是用ANTLR开始,试图解析一些模式出来一个日志文件使用ANTLR来分析日志文件

例如:日志文件:

7114422 2009-07- 16 15:43:07078 [LOGTHREAD] INFO StatusLog - 任务0 输入: uk.project.Evaluation.Input.Function1(选择= [ “红色”, “黄色”]){}

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

7114422 2009-07-16 15:43:07078 [LOGTHREAD] INFO StatusLog - 任务0 输入: uk.project.Evaluation.Input.Function3(选择= [ “蓝色”, “黄色”]){}

7114437 2009-07-16 15:43:07093 [LOGTHREAD] INFO StatusLog - 任务0 输出: uk.org.project.Evaluation.Output.Function4(选择= [ “语音”]){}

现在我必须解析这个文件才能找到'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'; 

回答

7

当你只在你解析文件的一部分感兴趣,你并不需要一个解析器和写文件整个格式的文法。只有词法分析器和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"]) 
+0

很好的例子,但犯规作品=/ –

+2

@arkilus,如果“它”不起作用,那么它就不是一个好例子,我会假设......但它确实有效。事实上,它不适用于你是一个完全不同的故事:) –

+0

对不起巴特,你的例子实际上完美的作品,问题是与我的构建路径...顺便谢谢你的美妙的帮助与ANTLR在所以:) –