我计划构建一个解析器,它只解析特定的格式,如下所示。
Dec 17 14:00:00 IP firewall,info FFFW forward: in:<pppoe-mm.demo.649> out:sfp-sfpplus1.vlan113, proto TCP (ACK,PSH), IP:PORT->IP:PORT, NAT (IP:PORT->IP:PORT)->IP:PORT, len 250
这是路由器的日志之一。我是个天真的开发者。几天前刚刚遇到ANTLR4。使用ANTLRWorks2我检查了我的语法。我使用ANTLR4创建了lexer和解析器这两个类。从现在起我不知道该怎么办。请引导。
我想,我必须创建另一个导入parser.java文件的java文件,并且在该文件中我必须编写解析器逻辑。
我随函附上语法文件。
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
grammar Hello;
r : MONTH ID TIME IP X UNAME Y PROTOCOL Z FULLIP SEP FULLIP W FULLIP SEP FULLIP V SEP FULLIP P; // match keyword hello followed by an identifier
MONTH:[A-Z][a-z]+;
ID : [0-9]+ ; // match lower-case identifiers
TIME : ID SEPERATOR ID SEPERATOR ID;
SEPERATOR: [:] | [.];
SEP: [-][>] ;
IP: ID SEPERATOR ID SEPERATOR ID SEPERATOR ID ;
FULLIP: IP SEPERATOR ID/*Port*/ ;
X: [a-z]+[,][a-z]+[ ][A-Z]+[ ][a-z]+[:][ ][a-z]+[:][<] ;
UNAME: [a-z]+[-][a-z]+[.][a-z]+[.][0-9]+ ;
Y: [>][ ][a-z]+[:][a-z]+[-][a-z]+[0-9][.][a-z]+[0-9]+[,][ ][a-z]+[ ] ;
PROTOCOL: [A-Z]+ ;
Z: [(][A-Z]+[,][A-Z]+[)][,];
W: [,][ ][A-Z]+[ ][(] ;
V: [)];
P: [,][ ][a-z]+[ ][0-9]+ ;
WS : [ trn]+ -> skip ; // skip spaces, tabs, newlines, r (Windows)
从解析器中获取解析树,然后使用访问者遍历它。