java Antlr 4 使用

1.IDEA 中安装antl 4 插件

2.


/** Taken from "The Definitive ANTLR 4 Reference" by Terence Parr */

// Derived from http://json.org
grammar JSON;

json
   : value EOF
   ;

obj
   : '{' pair (',' pair)* '}'
   | '{' '}'
   ;

pair
   : STRING ':' value
   ;

arr
   : '[' value (',' value)* ']'
   | '[' ']'
   ;

value
   : STRING
   | NUMBER
   | obj
   | arr
   | 'true'
   | 'false'
   | 'null'
   ;


STRING
   : '"' (ESC | SAFECODEPOINT)* '"'
   ;


fragment ESC
   : '\\' (["\\/bfnrt] | UNICODE)
   ;


fragment UNICODE
   : 'u' HEX HEX HEX HEX
   ;


fragment HEX
   : [0-9a-fA-F]
   ;


fragment SAFECODEPOINT
   : ~ ["\\\u0000-\u001F]
   ;


NUMBER
   : '-'? INT ('.' [0-9] +)? EXP?
   ;


fragment INT
   : '0' | [1-9] [0-9]*
   ;

// no leading zeros

fragment EXP
   : [Ee] [+\-]? INT
   ;

// \- since - means "range" inside [...]

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

fragment 定义终结符

WS 定义终结符

json定义非终结符

IDEA中G4设置

使用代码

String filename ="txt.json";
        InputStream in = new FileInputStream(filename);

        JsonLexer lexer = new JsonLexer(CharStreams.fromStream(in));
        JsonParser parser = new JsonParser(new CommonTokenStream(lexer));
        JsonToXml listener = new JsonToXml();

        ParseTreeWalker walker = new ParseTreeWalker();
        ParseTree tree = parser.json();
        walker.walk(listener,tree);
        System.out.println(listener.getXML(tree));
package jsonCode;

import jsonToXml.JsonBaseListener;
import jsonToXml.JsonParser;
import org.antlr.v4.runtime.tree.*;


public class JsonToXml extends JsonBaseListener {
    public ParseTreeProperty<String> xml = new ParseTreeProperty<>();
    //映射
    public String getXML(ParseTree ctx){return xml.get(ctx);}
    void  setXML(ParseTree ctx,String s){xml.put(ctx,s);}

    public static String stripQuotes(String s){
        if(s == null || s.charAt(0)!='"') return s;
        return s.substring(1,s.length()-1);
    }

    @Override
    public void exitAtom(JsonParser.AtomContext ctx) {
        setXML(ctx,ctx.getText());
    }

    @Override
    public void exitString(JsonParser.StringContext ctx) {
        setXML(ctx,stripQuotes(ctx.getText()));//退出字符串的时候应该做什么操作
    }

    @Override
    public void exitObjectValue(JsonParser.ObjectValueContext ctx) {
        setXML(ctx,getXML(ctx.object()));
    }

    @Override
    public void exitArrayValue(JsonParser.ArrayValueContext ctx) {
        setXML(ctx,getXML(ctx.array()));
    }

    @Override
    public void exitPair(JsonParser.PairContext ctx) {
        String tag = stripQuotes(ctx.STRING().getText());
        JsonParser.ValueContext vct = ctx.value();
        String x= String.format("<%s>%s</%s>\n",tag,getXML(vct),tag);
        setXML(ctx,x);
    }

    @Override
    public void exitAnObject(JsonParser.AnObjectContext ctx) {
        StringBuilder buf = new StringBuilder();
        buf.append("\n");
        for(JsonParser.PairContext pacts : ctx.pair()){
            buf.append(getXML(pacts));
        }
        setXML(ctx,buf.toString());
    }

    @Override
    public void exitEmptyObject(JsonParser.EmptyObjectContext ctx) {
        setXML(ctx,"");
    }

    @Override
    public void exitArrayOfValues(JsonParser.ArrayOfValuesContext ctx) {
        StringBuilder buf = new StringBuilder();
        buf.append("\n");
        for(JsonParser.ValueContext vctx : ctx.value()){
            buf.append("<element>");//将所有的元素连接成合法的XML文本
            buf.append(getXML(vctx));
            buf.append("</element>");
            buf.append("\n");
        }
        setXML(ctx,buf.toString());
    }

    @Override
    public void exitEmptyArray(JsonParser.EmptyArrayContext ctx) {
        setXML(ctx,"");
    }

    @Override
    public void exitJson(JsonParser.JsonContext ctx) {
        setXML(ctx,getXML(ctx.getChild(0)));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值