moved antlr parser to subproject

This commit is contained in:
2019-07-28 16:11:45 +01:00
parent ff9b26ed93
commit 36b0a1da3a
8 changed files with 191 additions and 167 deletions

View File

@@ -0,0 +1,90 @@
/** Taken from "The Definitive ANTLR 4 Reference" by Terence Parr */
// Derived from http://json.org
grammar JSON;
json
: value
;
obj
: '{' pair (',' pair)* '}'
| '{' '}'
;
pair
: STRING ':' value
;
array
: '[' value (',' value)* ']'
| '[' ']'
;
value
: STRING
| NUMBER
| obj
| array
| TRUE
| FALSE
| NULL
;
TRUE
: 'true'
;
FALSE
: 'false'
;
NULL
: '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
;

View File

@@ -0,0 +1,102 @@
package net.woggioni.worth.antlr;
import net.woggioni.worth.serialization.ValueParser;
import net.woggioni.worth.xface.Value;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ErrorNode;
import org.antlr.v4.runtime.tree.TerminalNode;
public class JSONListenerImpl extends ValueParser implements JSONListener {
public Value result = null;
private String unquote(String quoted) {
return quoted.substring(1, quoted.length() - 1);
}
@Override
public void enterJson(JSONParser.JsonContext ctx) {
}
@Override
public void exitJson(JSONParser.JsonContext ctx) {
result = stack.getFirst().value;
stack.clear();
}
@Override
public void enterObj(JSONParser.ObjContext ctx) {
beginObject();
}
@Override
public void exitObj(JSONParser.ObjContext ctx) {
endObject();
}
@Override
public void enterPair(JSONParser.PairContext ctx) {
objectKey(unquote(ctx.STRING().getText()));
}
@Override
public void exitPair(JSONParser.PairContext ctx) {
}
@Override
public void enterArray(JSONParser.ArrayContext ctx) {
beginArray();
}
@Override
public void exitArray(JSONParser.ArrayContext ctx) {
endArray();
}
@Override
public void enterValue(JSONParser.ValueContext ctx) {
if (ctx.obj() != null) {
} else if (ctx.array() != null) {
} else if (ctx.STRING() != null) {
stringValue(unquote(ctx.STRING().getText()));
} else if (ctx.TRUE() != null) {
booleanValue(true);
} else if (ctx.FALSE() != null) {
booleanValue(false);
} else if (ctx.NULL() != null) {
nullValue();
} else if (ctx.NUMBER() != null) {
String text = ctx.NUMBER().getText();
if (text.indexOf('.') < 0)
integerValue(Long.valueOf(text));
else
floatValue(Float.valueOf(text));
}
}
@Override
public void exitValue(JSONParser.ValueContext ctx) {
}
@Override
public void visitTerminal(TerminalNode node) {
}
@Override
public void visitErrorNode(ErrorNode node) {
}
@Override
public void enterEveryRule(ParserRuleContext ctx) {
}
@Override
public void exitEveryRule(ParserRuleContext ctx) {
}
}