Antlr4 - 语法解析日志文件

问题描述:

我想解析日志文件条目。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

我不是antlr专家。只是一个想法

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

使用-焦炭这是用来定义范围 你可以尝试另一种方式

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