2010-02-16 6 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] INFO StatusLog - Задача 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's 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

Хороший пример, но оленья кожа works =/ –

+2

@arkilus, если «он» не работает, это не хороший пример, я бы предположил ... Он * делает * работу, однако. Тот факт, что он не работает с вами, - это совсем другая история :) –

+0

Простите, Барт, ваш пример действительно работает отлично, проблема была в моем пути сборки ... btw благодарит за вашу замечательную помощь с ANTLR в SO :) –

Смежные вопросы