forked from jasder/antlr
snapshot; removed some dependencies to tool in runtime; made sure java grammar / parser still works
[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 8777]
This commit is contained in:
parent
de0881a88b
commit
ad98d17191
|
@ -2,7 +2,7 @@ package org.antlr.v4.runtime.atn;
|
||||||
|
|
||||||
import org.antlr.v4.misc.IntervalSet;
|
import org.antlr.v4.misc.IntervalSet;
|
||||||
import org.antlr.v4.runtime.RuleContext;
|
import org.antlr.v4.runtime.RuleContext;
|
||||||
import org.antlr.v4.tool.*;
|
import org.antlr.v4.tool.Rule;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
@ -12,7 +12,6 @@ public class ATN {
|
||||||
public static final int INVALID_ALT_NUMBER = -1;
|
public static final int INVALID_ALT_NUMBER = -1;
|
||||||
public static final int INVALID_DECISION_NUMBER = -1;
|
public static final int INVALID_DECISION_NUMBER = -1;
|
||||||
|
|
||||||
public Grammar g;
|
|
||||||
public List<ATNState> states = new ArrayList<ATNState>();
|
public List<ATNState> states = new ArrayList<ATNState>();
|
||||||
public List<ATNState> rules = new ArrayList<ATNState>(); // rule index to start state
|
public List<ATNState> rules = new ArrayList<ATNState>(); // rule index to start state
|
||||||
|
|
||||||
|
@ -41,17 +40,6 @@ public class ATN {
|
||||||
|
|
||||||
// TODO: for runtime all we need is states, decisionToATNState I think
|
// TODO: for runtime all we need is states, decisionToATNState I think
|
||||||
|
|
||||||
public ATN(Grammar g) {
|
|
||||||
this.g = g;
|
|
||||||
if ( g.isLexer() ) {
|
|
||||||
for (Rule r : g.rules.values()) {
|
|
||||||
ruleToTokenType.add(g.getTokenType(r.name));
|
|
||||||
if ( r.actionIndex>0 ) ruleToActionIndex.add(r.actionIndex);
|
|
||||||
else ruleToActionIndex.add(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Used for runtime deserialization of ATNs from strings */
|
/** Used for runtime deserialization of ATNs from strings */
|
||||||
public ATN() { }
|
public ATN() { }
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package org.antlr.v4.runtime.atn;
|
package org.antlr.v4.runtime.atn;
|
||||||
|
|
||||||
import org.antlr.v4.tool.*;
|
import org.antlr.v4.tool.Rule;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ public class ATNState {
|
||||||
public ATN atn = null;
|
public ATN atn = null;
|
||||||
|
|
||||||
/** ATN state is associated with which node in AST? */
|
/** ATN state is associated with which node in AST? */
|
||||||
public GrammarAST ast;
|
// public GrammarAST ast;
|
||||||
public Transition transition;
|
public Transition transition;
|
||||||
/** For o-A->o type ATN tranitions, record the label that leads to this
|
/** For o-A->o type ATN tranitions, record the label that leads to this
|
||||||
* state. Useful for creating rich error messages when we find
|
* state. Useful for creating rich error messages when we find
|
||||||
|
|
|
@ -225,7 +225,7 @@ public class LexerInterpreter extends ATNInterpreter {
|
||||||
else if ( trans.getClass() == RangeTransition.class ) {
|
else if ( trans.getClass() == RangeTransition.class ) {
|
||||||
RangeTransition rt = (RangeTransition)trans;
|
RangeTransition rt = (RangeTransition)trans;
|
||||||
if ( t>=rt.from && t<=rt.to ) {
|
if ( t>=rt.from && t<=rt.to ) {
|
||||||
if ( debug ) System.out.println("match range "+rt.toString(atn.g));
|
if ( debug ) System.out.println("match range "+rt.toString());
|
||||||
return rt.target;
|
return rt.target;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -233,7 +233,7 @@ public class LexerInterpreter extends ATNInterpreter {
|
||||||
SetTransition st = (SetTransition)trans;
|
SetTransition st = (SetTransition)trans;
|
||||||
boolean not = trans instanceof NotSetTransition;
|
boolean not = trans instanceof NotSetTransition;
|
||||||
if ( !not && st.label.member(t) || not && !st.label.member(t) ) {
|
if ( !not && st.label.member(t) || not && !st.label.member(t) ) {
|
||||||
if ( debug ) System.out.println("match set "+st.label.toString(atn.g));
|
if ( debug ) System.out.println("match set "+st.label.toString());
|
||||||
return st.target;
|
return st.target;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -601,8 +601,7 @@ public class ParserInterpreter extends ATNInterpreter {
|
||||||
|
|
||||||
public String getTokenName(int t) {
|
public String getTokenName(int t) {
|
||||||
if ( t==-1 ) return "EOF";
|
if ( t==-1 ) return "EOF";
|
||||||
if ( atn.g!=null ) return atn.g.getTokenDisplayName(t);
|
if ( parser!=null && parser.getTokenNames()!=null ) return parser.getTokenNames()[t]+"<"+t+">";
|
||||||
if ( parser !=null && parser.getTokenNames()!=null ) return parser.getTokenNames()[t]+"<"+t+">";
|
|
||||||
return String.valueOf(t);
|
return String.valueOf(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,8 +39,10 @@ public class QStack<T> {
|
||||||
|
|
||||||
public T pop() {
|
public T pop() {
|
||||||
if ( sp<0 ) throw new EmptyStackException();
|
if ( sp<0 ) throw new EmptyStackException();
|
||||||
|
T o = elements[sp];
|
||||||
elements[sp] = null; // let gc reclaim that element
|
elements[sp] = null; // let gc reclaim that element
|
||||||
return elements[sp--];
|
sp--;
|
||||||
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clear() { sp = -1; }
|
public void clear() { sp = -1; }
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
lexer grammar L;
|
lexer grammar L;
|
||||||
|
|
||||||
WS : ' '+ {skip();} ;
|
STRING_START : '"' {pushMode(STRING_MODE); more();} ;
|
||||||
|
WS : ' '|'\n' {skip();} ;
|
||||||
|
|
||||||
StringLiteral
|
mode STRING_MODE;
|
||||||
: '"' ( ~('\\'|'"') )* '"'
|
STRING : '"' {popMode();} ;
|
||||||
;
|
ANY : . {more();} ;
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
|
import org.antlr.v4.runtime.*;
|
||||||
|
|
||||||
public class TestL {
|
public class TestL {
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
// L lexer = new L(new ANTLRFileStream(args[0]));
|
L lexer = new L(new ANTLRFileStream(args[0]));
|
||||||
// CommonTokenStream tokens = new CommonTokenStream(lexer);
|
CommonTokenStream tokens = new CommonTokenStream(lexer);
|
||||||
// tokens.fill();
|
tokens.fill();
|
||||||
// System.out.println(tokens.getTokens());
|
System.out.println(tokens.getTokens());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ public class AnalysisPipeline {
|
||||||
|
|
||||||
public void process() {
|
public void process() {
|
||||||
// LEFT-RECURSION CHECK
|
// LEFT-RECURSION CHECK
|
||||||
LeftRecursionDetector lr = new LeftRecursionDetector(g.atn);
|
LeftRecursionDetector lr = new LeftRecursionDetector(g, g.atn);
|
||||||
lr.check();
|
lr.check();
|
||||||
if ( lr.listOfRecursiveCycles.size()>0 ) return; // bail out
|
if ( lr.listOfRecursiveCycles.size()>0 ) return; // bail out
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,12 @@ package org.antlr.v4.analysis;
|
||||||
|
|
||||||
import org.antlr.v4.misc.OrderedHashSet;
|
import org.antlr.v4.misc.OrderedHashSet;
|
||||||
import org.antlr.v4.runtime.atn.*;
|
import org.antlr.v4.runtime.atn.*;
|
||||||
import org.antlr.v4.tool.Rule;
|
import org.antlr.v4.tool.*;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class LeftRecursionDetector {
|
public class LeftRecursionDetector {
|
||||||
|
Grammar g;
|
||||||
public ATN atn;
|
public ATN atn;
|
||||||
|
|
||||||
/** Holds a list of cycles (sets of rule names). */
|
/** Holds a list of cycles (sets of rule names). */
|
||||||
|
@ -17,7 +18,10 @@ public class LeftRecursionDetector {
|
||||||
*/
|
*/
|
||||||
Set<RuleStartState> rulesVisitedPerRuleCheck = new HashSet<RuleStartState>();
|
Set<RuleStartState> rulesVisitedPerRuleCheck = new HashSet<RuleStartState>();
|
||||||
|
|
||||||
public LeftRecursionDetector(ATN atn) { this.atn = atn; }
|
public LeftRecursionDetector(Grammar g, ATN atn) {
|
||||||
|
this.g = g;
|
||||||
|
this.atn = atn;
|
||||||
|
}
|
||||||
|
|
||||||
public void check() {
|
public void check() {
|
||||||
for (RuleStartState start : atn.ruleToStartState.values()) {
|
for (RuleStartState start : atn.ruleToStartState.values()) {
|
||||||
|
@ -31,7 +35,7 @@ public class LeftRecursionDetector {
|
||||||
}
|
}
|
||||||
//System.out.println("cycles="+listOfRecursiveCycles);
|
//System.out.println("cycles="+listOfRecursiveCycles);
|
||||||
if ( listOfRecursiveCycles.size()>0 ) {
|
if ( listOfRecursiveCycles.size()>0 ) {
|
||||||
atn.g.tool.errMgr.leftRecursionCycles(atn.g.fileName, listOfRecursiveCycles);
|
g.tool.errMgr.leftRecursionCycles(g.fileName, listOfRecursiveCycles);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,15 +2,19 @@ package org.antlr.v4.automata;
|
||||||
|
|
||||||
import org.antlr.v4.misc.*;
|
import org.antlr.v4.misc.*;
|
||||||
import org.antlr.v4.runtime.atn.*;
|
import org.antlr.v4.runtime.atn.*;
|
||||||
import org.antlr.v4.tool.Rule;
|
import org.antlr.v4.tool.*;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class ATNSerializer {
|
public class ATNSerializer {
|
||||||
|
public Grammar g;
|
||||||
public ATN atn;
|
public ATN atn;
|
||||||
public List<IntervalSet> sets = new ArrayList<IntervalSet>();
|
public List<IntervalSet> sets = new ArrayList<IntervalSet>();
|
||||||
|
|
||||||
public ATNSerializer(ATN atn) { this.atn = atn; }
|
public ATNSerializer(Grammar g, ATN atn) {
|
||||||
|
this.g = g;
|
||||||
|
this.atn = atn;
|
||||||
|
}
|
||||||
|
|
||||||
/** Serialize state descriptors, edge descriptors, and decision->state map
|
/** Serialize state descriptors, edge descriptors, and decision->state map
|
||||||
* into list of ints:
|
* into list of ints:
|
||||||
|
@ -35,8 +39,8 @@ public class ATNSerializer {
|
||||||
*/
|
*/
|
||||||
public List<Integer> serialize() {
|
public List<Integer> serialize() {
|
||||||
List<Integer> data = new ArrayList<Integer>();
|
List<Integer> data = new ArrayList<Integer>();
|
||||||
data.add(atn.g.getType());
|
data.add(g.getType());
|
||||||
data.add(atn.g.getMaxTokenType());
|
data.add(g.getMaxTokenType());
|
||||||
data.add(atn.states.size());
|
data.add(atn.states.size());
|
||||||
int nedges = 0;
|
int nedges = 0;
|
||||||
// dump states, count edges and collect sets while doing so
|
// dump states, count edges and collect sets while doing so
|
||||||
|
@ -59,10 +63,10 @@ public class ATNSerializer {
|
||||||
for (int r=0; r<nrules; r++) {
|
for (int r=0; r<nrules; r++) {
|
||||||
ATNState ruleStartState = atn.rules.get(r);
|
ATNState ruleStartState = atn.rules.get(r);
|
||||||
data.add(ruleStartState.stateNumber);
|
data.add(ruleStartState.stateNumber);
|
||||||
if ( atn.g.isLexer() ) {
|
if ( g.isLexer() ) {
|
||||||
data.add(atn.ruleToTokenType.get(r));
|
data.add(atn.ruleToTokenType.get(r));
|
||||||
String ruleName = atn.g.rules.getKey(r);
|
String ruleName = g.rules.getKey(r);
|
||||||
Rule rule = atn.g.getRule(ruleName);
|
Rule rule = g.getRule(ruleName);
|
||||||
data.add(rule.actionIndex);
|
data.add(rule.actionIndex);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -212,24 +216,24 @@ public class ATNSerializer {
|
||||||
|
|
||||||
public String getTokenName(int t) {
|
public String getTokenName(int t) {
|
||||||
if ( t==-1 ) return "EOF";
|
if ( t==-1 ) return "EOF";
|
||||||
if ( atn.g!=null ) return atn.g.getTokenDisplayName(t);
|
if ( g!=null ) return g.getTokenDisplayName(t);
|
||||||
return String.valueOf(t);
|
return String.valueOf(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Used by Java target to encode short/int array as chars in string. */
|
/** Used by Java target to encode short/int array as chars in string. */
|
||||||
public static String getSerializedAsString(ATN atn) {
|
public static String getSerializedAsString(Grammar g, ATN atn) {
|
||||||
return new String(Utils.toCharArray(getSerialized(atn)));
|
return new String(Utils.toCharArray(getSerialized(g, atn)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<Integer> getSerialized(ATN atn) {
|
public static List<Integer> getSerialized(Grammar g, ATN atn) {
|
||||||
return new ATNSerializer(atn).serialize();
|
return new ATNSerializer(g, atn).serialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static char[] getSerializedAsChars(ATN atn) {
|
public static char[] getSerializedAsChars(Grammar g, ATN atn) {
|
||||||
return Utils.toCharArray(new ATNSerializer(atn).serialize());
|
return Utils.toCharArray(new ATNSerializer(g, atn).serialize());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getDecoded(ATN atn) {
|
public static String getDecoded(Grammar g, ATN atn) {
|
||||||
return new ATNSerializer(atn).decode(Utils.toCharArray(getSerialized(atn)));
|
return new ATNSerializer(g, atn).decode(Utils.toCharArray(getSerialized(g, atn)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,13 @@ public class LexerATNFactory extends ParserATNFactory {
|
||||||
atn.defineDecisionState(startState);
|
atn.defineDecisionState(startState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// INIT ACTION, RULE->TOKEN_TYPE MAP
|
||||||
|
for (Rule r : g.rules.values()) {
|
||||||
|
atn.ruleToTokenType.add(g.getTokenType(r.name));
|
||||||
|
if ( r.actionIndex>0 ) atn.ruleToActionIndex.add(r.actionIndex);
|
||||||
|
else atn.ruleToActionIndex.add(0);
|
||||||
|
}
|
||||||
|
|
||||||
// CREATE ATN FOR EACH RULE
|
// CREATE ATN FOR EACH RULE
|
||||||
_createATN(g.rules.values());
|
_createATN(g.rules.values());
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ public class ParserATNFactory implements ATNFactory {
|
||||||
public Rule currentRule;
|
public Rule currentRule;
|
||||||
ATN atn;
|
ATN atn;
|
||||||
|
|
||||||
public ParserATNFactory(Grammar g) { this.g = g; atn = new ATN(g); }
|
public ParserATNFactory(Grammar g) { this.g = g; atn = new ATN(); }
|
||||||
|
|
||||||
public ATN createATN() {
|
public ATN createATN() {
|
||||||
_createATN(g.rules.values());
|
_createATN(g.rules.values());
|
||||||
|
@ -458,7 +458,6 @@ public class ParserATNFactory implements ATNFactory {
|
||||||
try {
|
try {
|
||||||
Constructor ctor = nodeType.getConstructor();
|
Constructor ctor = nodeType.getConstructor();
|
||||||
ATNState s = (ATNState)ctor.newInstance();
|
ATNState s = (ATNState)ctor.newInstance();
|
||||||
s.ast = node;
|
|
||||||
s.setRule(currentRule);
|
s.setRule(currentRule);
|
||||||
atn.addState(s);
|
atn.addState(s);
|
||||||
return s;
|
return s;
|
||||||
|
@ -472,7 +471,6 @@ public class ParserATNFactory implements ATNFactory {
|
||||||
public ATNState newState(GrammarAST node) {
|
public ATNState newState(GrammarAST node) {
|
||||||
ATNState n = new ATNState();
|
ATNState n = new ATNState();
|
||||||
n.setRule(currentRule);
|
n.setRule(currentRule);
|
||||||
n.ast = node;
|
|
||||||
atn.addState(n);
|
atn.addState(n);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,7 +84,10 @@ public abstract class DefaultOutputModelFactory implements OutputModelFactory {
|
||||||
|
|
||||||
public void setRoot(OutputModelObject root) { this.root = root; }
|
public void setRoot(OutputModelObject root) { this.root = root; }
|
||||||
|
|
||||||
public RuleFunction getCurrentRule() { return currentRule.peek(); }
|
public RuleFunction getCurrentRule() {
|
||||||
|
if ( currentRule.size()>0 ) return currentRule.peek();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public void pushCurrentRule(RuleFunction r) { currentRule.push(r); }
|
public void pushCurrentRule(RuleFunction r) { currentRule.push(r); }
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,9 @@ public class LexerFactory extends DefaultOutputModelFactory {
|
||||||
public LexerFactory(CodeGenerator gen) { super(gen); }
|
public LexerFactory(CodeGenerator gen) { super(gen); }
|
||||||
|
|
||||||
public OutputModelObject buildOutputModel(OutputModelController controller) {
|
public OutputModelObject buildOutputModel(OutputModelController controller) {
|
||||||
LexerFile lexer = new LexerFile(this, getGenerator().getRecognizerFileName());
|
LexerFile file = new LexerFile(this, getGenerator().getRecognizerFileName());
|
||||||
setRoot(lexer);
|
setRoot(file);
|
||||||
return lexer;
|
file.lexer = new Lexer(this, file);
|
||||||
|
return file;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ public abstract class Choice extends RuleElement {
|
||||||
if ( expr instanceof TestSetInline) {
|
if ( expr instanceof TestSetInline) {
|
||||||
TestSetInline e = (TestSetInline)expr;
|
TestSetInline e = (TestSetInline)expr;
|
||||||
Decl d = new TokenTypeDecl(factory, e.varName);
|
Decl d = new TokenTypeDecl(factory, e.varName);
|
||||||
factory.getCurrentRule().addContextDecl(d);
|
factory.getCurrentRule().addLocalDecl(d);
|
||||||
CaptureNextTokenType nextType = new CaptureNextTokenType(e.varName);
|
CaptureNextTokenType nextType = new CaptureNextTokenType(e.varName);
|
||||||
addPreambleOp(nextType);
|
addPreambleOp(nextType);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,5 @@ public class LexerFile extends OutputModelObject {
|
||||||
GrammarAST ast = g.namedActions.get(name);
|
GrammarAST ast = g.namedActions.get(name);
|
||||||
namedActions.put(name, new Action(factory, ast));
|
namedActions.put(name, new Action(factory, ast));
|
||||||
}
|
}
|
||||||
lexer = new Lexer(factory, this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -78,25 +78,6 @@ public class RuleFunction extends OutputModelObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
startState = factory.getGrammar().atn.ruleToStartState.get(r);
|
startState = factory.getGrammar().atn.ruleToStartState.get(r);
|
||||||
|
|
||||||
// // TRIGGER factory functions for rule elements
|
|
||||||
// factory.currentRule.push(this);
|
|
||||||
// GrammarASTAdaptor adaptor = new GrammarASTAdaptor(r.ast.token.getInputStream());
|
|
||||||
// GrammarAST blk = (GrammarAST)r.ast.getFirstChildWithType(ANTLRParser.BLOCK);
|
|
||||||
// CommonTreeNodeStream nodes = new CommonTreeNodeStream(adaptor,blk);
|
|
||||||
// SourceGenTriggers genTriggers = new SourceGenTriggers(nodes, factory);
|
|
||||||
// try {
|
|
||||||
// code = genTriggers.block(null,null); // GEN Instr OBJECTS
|
|
||||||
// }
|
|
||||||
// catch (Exception e){
|
|
||||||
// e.printStackTrace(System.err);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// ctxType = factory.gen.target.getRuleFunctionContextStructName(r);
|
|
||||||
// ruleCtx.name = ctxType;
|
|
||||||
//
|
|
||||||
// if ( ruleCtx.isEmpty() ) ruleCtx = null;
|
|
||||||
// factory.currentRule.pop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Add local var decl */
|
/** Add local var decl */
|
||||||
|
|
|
@ -11,7 +11,7 @@ public class SerializedATN extends OutputModelObject {
|
||||||
public List<String> serialized;
|
public List<String> serialized;
|
||||||
public SerializedATN(OutputModelFactory factory, ATN atn) {
|
public SerializedATN(OutputModelFactory factory, ATN atn) {
|
||||||
super(factory);
|
super(factory);
|
||||||
List<Integer> data = ATNSerializer.getSerialized(atn);
|
List<Integer> data = ATNSerializer.getSerialized(factory.getGrammar(), atn);
|
||||||
serialized = new ArrayList<String>(data.size());
|
serialized = new ArrayList<String>(data.size());
|
||||||
for (int c : data) {
|
for (int c : data) {
|
||||||
String encoded = factory.getGenerator().target.encodeIntAsCharEscape(c);
|
String encoded = factory.getGenerator().target.encodeIntAsCharEscape(c);
|
||||||
|
|
|
@ -270,7 +270,7 @@ LabelElementPair lp = new LabelElementPair(g, $id, $e, $start.getType());
|
||||||
//currentRule.labelDefs.map($id.text, lp);
|
//currentRule.labelDefs.map($id.text, lp);
|
||||||
currentRule.alt[currentAlt].labelDefs.map($id.text, lp);
|
currentRule.alt[currentAlt].labelDefs.map($id.text, lp);
|
||||||
}
|
}
|
||||||
: {inContext("RULE ...")}?
|
: {inContext("RULE ...") && !inContext("OPTIONS ...")}?
|
||||||
( ^(ASSIGN id=ID e=.)
|
( ^(ASSIGN id=ID e=.)
|
||||||
| ^(PLUS_ASSIGN id=ID e=.)
|
| ^(PLUS_ASSIGN id=ID e=.)
|
||||||
)
|
)
|
||||||
|
|
|
@ -115,11 +115,10 @@ public class TestATNDeserialization extends BaseTest {
|
||||||
|
|
||||||
protected void checkDeserializationIsStable(Grammar g) {
|
protected void checkDeserializationIsStable(Grammar g) {
|
||||||
ATN atn = createATN(g);
|
ATN atn = createATN(g);
|
||||||
char[] data = Utils.toCharArray(ATNSerializer.getSerialized(atn));
|
char[] data = Utils.toCharArray(ATNSerializer.getSerialized(g, atn));
|
||||||
String atnData = ATNSerializer.getDecoded(atn);
|
String atnData = ATNSerializer.getDecoded(g, atn);
|
||||||
ATN atn2 = ParserInterpreter.deserialize(data);
|
ATN atn2 = ParserInterpreter.deserialize(data);
|
||||||
atn2.g = g;
|
String atn2Data = ATNSerializer.getDecoded(g, atn2);
|
||||||
String atn2Data = ATNSerializer.getDecoded(atn2);
|
|
||||||
|
|
||||||
assertEquals(atnData, atn2Data);
|
assertEquals(atnData, atn2Data);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"4->5 ATOM 4,0\n" +
|
"4->5 ATOM 4,0\n" +
|
||||||
"5->1 EPSILON 0,0\n";
|
"5->1 EPSILON 0,0\n";
|
||||||
ATN atn = createATN(g);
|
ATN atn = createATN(g);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(g, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"2->3 NOT_ATOM 3,0\n" +
|
"2->3 NOT_ATOM 3,0\n" +
|
||||||
"3->1 EPSILON 0,0\n";
|
"3->1 EPSILON 0,0\n";
|
||||||
ATN atn = createATN(g);
|
ATN atn = createATN(g);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(g, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"2->3 WILDCARD 0,0\n" +
|
"2->3 WILDCARD 0,0\n" +
|
||||||
"3->1 EPSILON 0,0\n";
|
"3->1 EPSILON 0,0\n";
|
||||||
ATN atn = createATN(g);
|
ATN atn = createATN(g);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(g, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"9->1 EPSILON 0,0\n" +
|
"9->1 EPSILON 0,0\n" +
|
||||||
"0:8\n";
|
"0:8\n";
|
||||||
ATN atn = createATN(g);
|
ATN atn = createATN(g);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(g, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"15->1 EPSILON 0,0\n" +
|
"15->1 EPSILON 0,0\n" +
|
||||||
"0:14\n";
|
"0:14\n";
|
||||||
ATN atn = createATN(g);
|
ATN atn = createATN(g);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(g, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,7 +191,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"1:4\n" +
|
"1:4\n" +
|
||||||
"2:6\n";
|
"2:6\n";
|
||||||
ATN atn = createATN(g);
|
ATN atn = createATN(g);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(g, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,7 +222,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"6->7 ATOM 3,0\n" +
|
"6->7 ATOM 3,0\n" +
|
||||||
"7->3 EPSILON 0,0\n";
|
"7->3 EPSILON 0,0\n";
|
||||||
ATN atn = createATN(g);
|
ATN atn = createATN(g);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(g, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,7 +255,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"8->4 EPSILON 0,0\n" +
|
"8->4 EPSILON 0,0\n" +
|
||||||
"0:0\n";
|
"0:0\n";
|
||||||
ATN atn = createATN(lg);
|
ATN atn = createATN(lg);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(lg, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,7 +278,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"4->2 EPSILON 0,0\n" +
|
"4->2 EPSILON 0,0\n" +
|
||||||
"0:0\n";
|
"0:0\n";
|
||||||
ATN atn = createATN(lg);
|
ATN atn = createATN(lg);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(lg, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -313,7 +313,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"2:5\n" +
|
"2:5\n" +
|
||||||
"3:7\n";
|
"3:7\n";
|
||||||
ATN atn = createATN(lg);
|
ATN atn = createATN(lg);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(lg, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -360,7 +360,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"14->6 EPSILON 0,0\n" +
|
"14->6 EPSILON 0,0\n" +
|
||||||
"0:0\n";
|
"0:0\n";
|
||||||
ATN atn = createATN(lg);
|
ATN atn = createATN(lg);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(lg, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,7 +384,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"4->2 EPSILON 0,0\n" +
|
"4->2 EPSILON 0,0\n" +
|
||||||
"0:0\n";
|
"0:0\n";
|
||||||
ATN atn = createATN(lg);
|
ATN atn = createATN(lg);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(lg, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,7 +408,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"4->2 EPSILON 0,0\n" +
|
"4->2 EPSILON 0,0\n" +
|
||||||
"0:0\n";
|
"0:0\n";
|
||||||
ATN atn = createATN(lg);
|
ATN atn = createATN(lg);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(lg, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -437,7 +437,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"6->2 EPSILON 0,0\n" +
|
"6->2 EPSILON 0,0\n" +
|
||||||
"0:0\n";
|
"0:0\n";
|
||||||
ATN atn = createATN(lg);
|
ATN atn = createATN(lg);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(lg, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,7 +488,7 @@ public class TestATNSerialization extends BaseTest {
|
||||||
"1:1\n" +
|
"1:1\n" +
|
||||||
"2:2\n";
|
"2:2\n";
|
||||||
ATN atn = createATN(lg);
|
ATN atn = createATN(lg);
|
||||||
String result = ATNSerializer.getDecoded(atn);
|
String result = ATNSerializer.getDecoded(lg, atn);
|
||||||
assertEquals(expecting, result);
|
assertEquals(expecting, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue