2017-08-10 80 views
1

我想解析日誌文件條目。Antlr4 - 語法解析日誌文件

LogGram.g4

grammar LogGram; 

logs: log* ; 

log : dateformat Identifier '[' className ']' '(' thread ')' 
; 

thread : Letter+ SPECIAL* LetterOrDigit+ 
    ; 

className : Identifier ('.' Identifier)* ; 

dateformat : DATE TMSTAMP ;  

Identifier : Letter LetterOrDigit* ; 

Letter : [a-zA-Z$_] ; 

LetterOrDigit : [a-zA-Z0-9$_]; 

SPECIAL : [[email protected]#,;:'"/] ; 

DATE : DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT ; 

TMSTAMP : DIGIT DIGIT ':' DIGIT DIGIT ':' DIGIT DIGIT ',' DIGIT DIGIT DIGIT   
; 

DIGIT : [0-9] ; 

WS : [ \t\r\n\u000C]+ -> skip; 

的server.log

2017-08-10 12:50:56,081 ERROR [io.undertow.request] (default task-32) 

控制檯輸出而分析和打印它

line 1:53 mismatched input 'default' expecting Letter 
2017-08-10 12:50:56,081 ERROR [io.undertow.request] (defaulttask-32) 

爲什麼打印輸出前出現不匹配行?

+0

你的語法錯誤一般。例如,詞法規則'Letter'永遠不會匹配,因爲每個字母也是一個'Identifier'。請記住,該解析器無法指示詞法分析器如何將輸入拆分爲令牌。 *首先*詞法分析器完成它的工作,只有解析器才能看到生成的記號流。由於在日誌文件中沒有定義明確的令牌,並且它們依賴於上下文,所以您可能需要徹底拋棄分析器並將模糊語法與詞法分析器配合使用。 – doublep

+0

@doublep感謝您的建議。我將通讀ANTLR4參考書以瞭解更多關於詞法分析器的知識。 – Tony

+0

雖然也許最好是反過來寫一個匹配單個字符的詞法分析器,並將像'identifier'這樣的規則移動到解析器級別。很難說。 – doublep

回答

1

我不是antlr專家。只是一個想法

SPECIAL : [[email protected]#,;:'"/] ; 

使用-焦炭這是用來定義範圍 你可以嘗試另一種方式

HYPHEN : '-'; 
SPECIAL : [@#,;:'"/] | HYPHEN ;