[英]Visitor file issue in ANTLR4 parser
在Visitor類中寫什么?
我們已經為我們的語言做了語法。 我們不需要對其執行任何操作。 如果語言是通過書面語法傳遞的,那么我們只想從中獲取一些對象。
給定語言作為輸入:
Dec 17 14:00:00 103.56.229.11 firewall,info FFFW forward: in:<pppoe-mm.demo.649> out:sfp-sfpplus1.vlan113, proto TCP (ACK,PSH), 10.0.15.245:49831->103.235.46.39:443, NAT (10.0.15.245:49831->202.173.127.253:49831)->103.235.46.39:443, len 250
所需的輸出:
Dec, 17, 14:00:00, 103.56.229.11, pppoe-mm.demo.649, TCP, 10.0.15.245:49831, 103.235.46.39:443, 202.173.127.253:49831
我們的語法(文件名:sys.g):(運行良好,我們使用ANTLRWorks2對其進行了證明)
/*
* 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 sys;
r: IDENT NUM time ip x+ user xout proto xuser ipfull xtra ipfull xtra1 ipfull xtra ipfull xtra2 ipfull xtra3;
time: NUM SEP NUM SEP NUM;
ip: NUM USER NUM USER NUM USER NUM ;
ipfull: NUM USER NUM USER NUM USER NUM SEP NUM ;
x: (IDENT | SEP | NUM)+ LTHAN;
user: (IDENT | USER | NUM)+ ;
xuser: (IDENT | SEP | NUM)+ ;
xout: GTHAN IDENT+ SEP IDENT+ USER IDENT+ USER IDENT SEP IDENT;
proto: IDENT ;
xtra: USER GTHAN ;
xtra1: SEP IDENT SEP;
xtra2: SEP xtra;
xtra3: SEP IDENT NUM;
IDENT: ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'9')* ;
NUM: ('0'..'9')+ ;
LTHAN: '<' ;
GTHAN: '>' ;
SEP: ':' | ',' | '(' | ')' ;
USER: '-' | '.' ;
WS : (' ' | '\t' | '\r' | '\n')+ -> skip ;
為給定語言生成的樹:
問題1:我們使用antlr4.5編譯了語法文件,還使用了visitor。 因此,我們的問題是如何在另一個文件中打印特定對象?
問題2:是否需要制作另一個名為“值”的類,該類將值返回給訪問者?
EvalVisitor.java文件:
public class EvalVisitor extends sysBaseVisitor{
//
}
我們的主要Java文件SysLogCheck.java,其中我們使用的是語法sys.g文件生成的Lexer(SysLexer.java)和Parser(SysParser.java)。
import org.antlr.v4.runtime.ANTLRFileStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import java.io.*;
import org.antlr.v4.runtime.*;
public class SysLogCheck {
public static void main(String[] args) throws Exception {
ANTLRInputStream input = new ANTLRInputStream(new FileInputStream(new File("input.txt")));
sysLexer lexer = new sysLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
sysParser parser = new sysParser(tokens);
ParseTree tree = parser.r();
EvalVisitor visitor = new EvalVisitor();
visitor.visit(tree);
}
}
至於第一個問題:
這是一個原始訪客的示例,其輸出Dec, 17, 14:00:00
: Dec, 17, 14:00:00
: Dec, 17, 14:00:00
:
在讀取/* do something with the results */
您可以放置一些代碼來保存結果。
import org.antlr.v4.runtime.tree.ParseTree;
public class EvalVisitor extends sysBaseVisitor{
class LogEntry {
String ident1;
String dayNum;
String ip;
/*
...
*/
}
static LogEntry logEntry;
@Override
public Object visit(ParseTree tree) {
/* Setup logentry used by all visitors (this case, there is only a single visitor...)*/
logEntry = new LogEntry();
/* visit */
final Object o = super.visit(tree);
/* do something with the results */
System.out.println(logEntry.ident1 + ", " + logEntry.dayNum + ", " + logEntry.ip);
return o;
}
StringBuilder stringBuilder;
@Override
public Object visitR(sysParser.RContext ctx) {
logEntry.ident1 = ctx.IDENT().getText();
logEntry.dayNum = ctx.NUM().getText();
return super.visitR(ctx);
}
@Override
public Object visitTime(sysParser.TimeContext ctx) {
logEntry.ip = ctx.getText();
return super.visitTime(ctx);
}
@Override
public Object visitIp(sysParser.IpContext ctx) {
return super.visitIp(ctx);
}
@Override
public Object visitIpfull(sysParser.IpfullContext ctx) {
return super.visitIpfull(ctx);
}
@Override
public Object visitX(sysParser.XContext ctx) {
return super.visitX(ctx);
}
@Override
public Object visitUser(sysParser.UserContext ctx) {
return super.visitUser(ctx);
}
@Override
public Object visitXuser(sysParser.XuserContext ctx) {
return super.visitXuser(ctx);
}
@Override
public Object visitXout(sysParser.XoutContext ctx) {
return super.visitXout(ctx);
}
@Override
public Object visitProto(sysParser.ProtoContext ctx) {
return super.visitProto(ctx);
}
@Override
public Object visitXtra(sysParser.XtraContext ctx) {
return super.visitXtra(ctx);
}
@Override
public Object visitXtra1(sysParser.Xtra1Context ctx) {
return super.visitXtra1(ctx);
}
@Override
public Object visitXtra2(sysParser.Xtra2Context ctx) {
return super.visitXtra2(ctx);
}
@Override
public Object visitXtra3(sysParser.Xtra3Context ctx) {
return super.visitXtra3(ctx);
}
//
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.