Parsing Antlr4令牌存在扰乱了解析

Parsing Antlr4令牌存在扰乱了解析,parsing,logging,compiler-construction,antlr,antlr4,Parsing,Logging,Compiler Construction,Antlr,Antlr4,第一次,如果我违反了规则,我深表歉意。 我使用Antlr4创建日志解析器,遇到了一些我不理解的问题 我正在尝试分析以下输入日志序列: USA1-RR-SRX240-EDGE-01 created 10.20.30.40/50985->11.12.13.14/443 使用以下语法: grammar Juniper; WS : (' '|'\t')+ -> skip ; NL : '\r'? '\n' -> skip ; fragment DIGIT : '0'..'9' ;

第一次,如果我违反了规则,我深表歉意。 我使用Antlr4创建日志解析器,遇到了一些我不理解的问题

我正在尝试分析以下输入日志序列:

USA1-RR-SRX240-EDGE-01 created 10.20.30.40/50985->11.12.13.14/443
使用以下语法:

grammar Juniper;

WS : (' '|'\t')+ -> skip ;
NL : '\r'? '\n' -> skip ;
fragment DIGIT : '0'..'9' ;
NUMBER : DIGIT+ ;
IPADDRESS : NUMBER '.' NUMBER '.' NUMBER '.' NUMBER ;
SLASH : '/' -> skip ;
RIGHTARROW : '->' -> skip ;
CREATED: 'created' -> skip ;
HOSTNAME : [a-zA-Z0-9\-]+ ;

/* Input sample for rule: USA1-RR-SRX240-EDGE-01 created 10.20.30.40/50985->11.12.13.14/443 */
testcase : HOSTNAME WS CREATED WS IPADDRESS SLASH NUMBER RIGHTARROW IPADDRESS SLASH NUMBER NL;
这是失败的,我一辈子都不知道为什么。我知道令牌识别错误与我为字符类中包含破折号的主机名定义的令牌有关,但我不确定如何修复它

$ antlr4 Juniper.g4 && javac Juniper*.java && grun Juniper testcase -tree
USA1-RR-SRX240-EDGE-01 created 10.20.30.40/50985->11.12.13.14/443
line 1:48 token recognition error at: '>'
line 1:30 mismatched input '10.20.30.40' expecting WS
(testcase SA1-RR-SRX240-EDGE-01 10.20.30.40 50985- 11.12.13.14 443)
请注意,上面输出的第二行是我粘贴到grun中的数据,然后点击enter并点击control+D


如果您能在这方面提供任何帮助,我将不胜感激,因为我已经在键盘上敲击了一会儿。

识别->的问题在于主机名匹配任何字母、数字和破折号序列,其中包括50985-。因为该匹配比50985匹配的数字要长,所以主机名获胜。那显然不是你想要的

解析日志行通常需要一个上下文敏感的扫描器,而标准解析器生成器(更倾向于解析编程语言)并不总是理想的工具。例如,在这种情况下,主机名不能出现在识别它的上下文中,因此它甚至不应该出现在可能的标记列表中


当然,你可以定义一个令牌,它由一个ip号码和一个用斜线分隔的端口组成,这将解决歧义,但在我看来,这是次优的,因为你最终会重新扫描该标记来解析它。

意识到我的理解有一个差距,因为lexer在lexer规则中进行了第一次遍历和跳过,这意味着解析器根本看不到它。好的,如果你想让解析器看到一个标记,不要使用skip。或者,如果你想像跳过空格一样跳过字符,不要把WS标记放在语法中;它可能包含用于这种类型解析的某些功能。就我个人而言,我会使用不同的机制来分析日志文件,可能只是一个正则表达式,然后分析捕获,但是你也可以考虑一个自定义的Listar类,它可以跟踪上下文。在java后台工具栏上有没有任何一个很棒的工具包,比如Antlr,你可以推荐在上下文中?扎克:我不做太多java,所以我不是真正的Atto to Java工具包。很抱歉我相信谷歌会帮你找到一些东西,但是你可以用正则表达式把这些行拆开。取决于完整日志格式的复杂程度。遗憾的是,结构化日志记录如此罕见: