forked from jasder/antlr
got basic NFA code gen and interp working
[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 6822]
This commit is contained in:
parent
4093bb326e
commit
0516292911
|
@ -6,8 +6,12 @@ import java.util.List;
|
||||||
/** */
|
/** */
|
||||||
public class Bytecode {
|
public class Bytecode {
|
||||||
public static final int MAX_OPNDS = 3; // Or single opnd indicating variable number
|
public static final int MAX_OPNDS = 3; // Or single opnd indicating variable number
|
||||||
public static final int OPND_SIZE_IN_BYTES = 2;
|
public static final int ADDR_SIZE = 2;
|
||||||
public enum OperandType { NONE, CHAR, ADDR, INT, VARARGS }
|
public enum OperandType {
|
||||||
|
NONE(0), BYTE(1), CHAR(2), ADDR(ADDR_SIZE), SHORT(2), INT(4), VARARGS(0);
|
||||||
|
public int sizeInBytes;
|
||||||
|
OperandType(int sizeInBytes) { this.sizeInBytes = sizeInBytes; }
|
||||||
|
}
|
||||||
|
|
||||||
public static class Instruction {
|
public static class Instruction {
|
||||||
String name; // E.g., "load_str", "new"
|
String name; // E.g., "load_str", "new"
|
||||||
|
@ -38,22 +42,26 @@ public class Bytecode {
|
||||||
public static final short ACCEPT = 1;
|
public static final short ACCEPT = 1;
|
||||||
public static final short JMP = 2;
|
public static final short JMP = 2;
|
||||||
public static final short SPLIT = 3;
|
public static final short SPLIT = 3;
|
||||||
public static final short MATCH = 4;
|
public static final short MATCH8 = 4;
|
||||||
public static final short RANGE = 5;
|
public static final short MATCH16 = 5;
|
||||||
|
public static final short RANGE8 = 6;
|
||||||
|
public static final short RANGE16 = 7;
|
||||||
|
|
||||||
/** Used for disassembly; describes instruction set */
|
/** Used for disassembly; describes instruction set */
|
||||||
public static Instruction[] instructions = new Instruction[] {
|
public static Instruction[] instructions = new Instruction[] {
|
||||||
null, // <INVALID>
|
null, // <INVALID>
|
||||||
new Instruction("accept", OperandType.INT), // index is the opcode
|
new Instruction("accept", OperandType.SHORT), // index is the opcode
|
||||||
new Instruction("jmp", OperandType.ADDR),
|
new Instruction("jmp", OperandType.ADDR),
|
||||||
new Instruction("split", OperandType.VARARGS),
|
new Instruction("split", OperandType.VARARGS),
|
||||||
new Instruction("match", OperandType.CHAR),
|
new Instruction("match8", OperandType.BYTE),
|
||||||
new Instruction("range", OperandType.CHAR, OperandType.CHAR)
|
new Instruction("match16", OperandType.CHAR),
|
||||||
|
new Instruction("range8", OperandType.BYTE, OperandType.BYTE),
|
||||||
|
new Instruction("range16", OperandType.CHAR, OperandType.CHAR)
|
||||||
};
|
};
|
||||||
|
|
||||||
public static String disassemble(byte[] code) {
|
public static String disassemble(byte[] code, int start) {
|
||||||
StringBuilder buf = new StringBuilder();
|
StringBuilder buf = new StringBuilder();
|
||||||
int i=0;
|
int i=start;
|
||||||
while (i<code.length) {
|
while (i<code.length) {
|
||||||
i = disassembleInstruction(buf, code, i);
|
i = disassembleInstruction(buf, code, i);
|
||||||
buf.append('\n');
|
buf.append('\n');
|
||||||
|
@ -61,6 +69,8 @@ public class Bytecode {
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String disassemble(byte[] code) { return disassemble(code, 0); }
|
||||||
|
|
||||||
public static String disassembleInstruction(byte[] code, int ip) {
|
public static String disassembleInstruction(byte[] code, int ip) {
|
||||||
StringBuilder buf = new StringBuilder();
|
StringBuilder buf = new StringBuilder();
|
||||||
disassembleInstruction(buf, code, ip);
|
disassembleInstruction(buf, code, ip);
|
||||||
|
@ -86,26 +96,36 @@ public class Bytecode {
|
||||||
return ip;
|
return ip;
|
||||||
}
|
}
|
||||||
List<String> operands = new ArrayList<String>();
|
List<String> operands = new ArrayList<String>();
|
||||||
for (int i=0; i<I.n; i++) {
|
if ( I.n==1 && I.type[0]==OperandType.VARARGS) { // get n (opnd) operands
|
||||||
int opnd = getShort(code, ip);
|
int n = getShort(code, ip);
|
||||||
ip += Bytecode.OPND_SIZE_IN_BYTES;
|
ip += 2;
|
||||||
switch ( I.type[i] ) {
|
// operands.add(String.valueOf(n)); don't show n in varargs
|
||||||
case CHAR :
|
for (int j=1; j<=n; j++) {
|
||||||
operands.add("'"+(char)opnd+"'");
|
operands.add(String.valueOf(getShort(code, ip)));
|
||||||
break;
|
ip += ADDR_SIZE; // VARARGS only works on address for now
|
||||||
case VARARGS : // get n (opnd) operands
|
}
|
||||||
int n = opnd;
|
}
|
||||||
// operands.add(String.valueOf(n)); don't show n in varargs
|
else {
|
||||||
for (int j=0; j<n; j++) {
|
for (int i=0; i<I.n; i++) {
|
||||||
|
switch ( I.type[i] ) {
|
||||||
|
case NONE:
|
||||||
|
break;
|
||||||
|
case BYTE:
|
||||||
|
operands.add("'"+(char)code[ip]+"'");
|
||||||
|
break;
|
||||||
|
case CHAR :
|
||||||
|
operands.add("'"+(char)getShort(code, ip)+"'");
|
||||||
|
break;
|
||||||
|
case INT :
|
||||||
|
operands.add("'"+(char)getInt(code, ip)+"'");
|
||||||
|
case SHORT :
|
||||||
|
case ADDR :
|
||||||
operands.add(String.valueOf(getShort(code, ip)));
|
operands.add(String.valueOf(getShort(code, ip)));
|
||||||
ip += OPND_SIZE_IN_BYTES;
|
break;
|
||||||
}
|
default :
|
||||||
break;
|
System.err.println("invalid opnd type: "+I.type[i]);
|
||||||
case INT :
|
}
|
||||||
case ADDR :
|
ip += I.type[i].sizeInBytes;
|
||||||
default:
|
|
||||||
operands.add(String.valueOf(opnd));
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int i = 0; i < operands.size(); i++) {
|
for (int i = 0; i < operands.size(); i++) {
|
||||||
|
@ -116,10 +136,17 @@ public class Bytecode {
|
||||||
return ip;
|
return ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int getInt(byte[] memory, int index) {
|
||||||
|
int b1 = memory[index++]&0xFF; // high byte
|
||||||
|
int b2 = memory[index++]&0xFF;
|
||||||
|
int b3 = memory[index++]&0xFF;
|
||||||
|
int b4 = memory[index++]&0xFF; // low byte
|
||||||
|
return b1<<(8*3) | b2<<(8*2) | b3<<(8*1) | b4;
|
||||||
|
}
|
||||||
|
|
||||||
public static int getShort(byte[] memory, int index) {
|
public static int getShort(byte[] memory, int index) {
|
||||||
int b1 = memory[index++]&0xFF; // mask off sign-extended bits
|
int b1 = memory[index++]&0xFF; // mask off sign-extended bits
|
||||||
int b2 = memory[index++]&0xFF;
|
int b2 = memory[index++]&0xFF;
|
||||||
int word = b1<<(8*1) | b2;
|
return b1<<(8*1) | b2;
|
||||||
return word;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,35 +2,48 @@ package org.antlr.v4.runtime.nfa;
|
||||||
|
|
||||||
import org.antlr.runtime.CharStream;
|
import org.antlr.runtime.CharStream;
|
||||||
|
|
||||||
/** http://swtch.com/~rsc/regexp/regexp2.html */
|
import java.util.Map;
|
||||||
public class Interpreter {
|
|
||||||
byte[] code;
|
/** http://swtch.com/~rsc/regexp/regexp2.html */
|
||||||
public Interpreter(byte[] code) { this.code = code; }
|
/*
|
||||||
|
for(;;){
|
||||||
|
switch(pc->opcode){
|
||||||
|
case Char:
|
||||||
|
if(*sp != pc->c)
|
||||||
|
return 0;
|
||||||
|
pc++;
|
||||||
|
sp++;
|
||||||
|
continue;
|
||||||
|
case Match:
|
||||||
|
return 1;
|
||||||
|
case Jmp:
|
||||||
|
pc = pc->x;
|
||||||
|
continue;
|
||||||
|
case Split:
|
||||||
|
if(recursiveloop(pc->x, sp))
|
||||||
|
return 1;
|
||||||
|
pc = pc->y;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
assert(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
public class NFA {
|
||||||
|
public byte[] code;
|
||||||
|
Map<String, Integer> ruleToAddr;
|
||||||
|
|
||||||
|
public NFA(byte[] code, Map<String, Integer> ruleToAddr) {
|
||||||
|
this.code = code;
|
||||||
|
this.ruleToAddr = ruleToAddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int exec(CharStream input, String ruleName) {
|
||||||
|
return exec(input, ruleToAddr.get(ruleName));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int exec(CharStream input) { return exec(input, 0); }
|
||||||
|
|
||||||
/*
|
|
||||||
for(;;){
|
|
||||||
switch(pc->opcode){
|
|
||||||
case Char:
|
|
||||||
if(*sp != pc->c)
|
|
||||||
return 0;
|
|
||||||
pc++;
|
|
||||||
sp++;
|
|
||||||
continue;
|
|
||||||
case Match:
|
|
||||||
return 1;
|
|
||||||
case Jmp:
|
|
||||||
pc = pc->x;
|
|
||||||
continue;
|
|
||||||
case Split:
|
|
||||||
if(recursiveloop(pc->x, sp))
|
|
||||||
return 1;
|
|
||||||
pc = pc->y;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
assert(0);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
public int exec(CharStream input, int ip) {
|
public int exec(CharStream input, int ip) {
|
||||||
while ( ip < code.length ) {
|
while ( ip < code.length ) {
|
||||||
int c = input.LA(1);
|
int c = input.LA(1);
|
||||||
|
@ -38,18 +51,24 @@ public class Interpreter {
|
||||||
short opcode = code[ip];
|
short opcode = code[ip];
|
||||||
ip++; // move to next instruction or first byte of operand
|
ip++; // move to next instruction or first byte of operand
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case Bytecode.MATCH :
|
case Bytecode.MATCH8 :
|
||||||
int o = getShort(code, ip);
|
if ( c != code[ip] ) return 0;
|
||||||
ip += 2;
|
ip++;
|
||||||
if ( c != o ) return 0;
|
|
||||||
input.consume();
|
input.consume();
|
||||||
break;
|
break;
|
||||||
case Bytecode.RANGE :
|
case Bytecode.MATCH16 :
|
||||||
int from = getShort(code, ip);
|
if ( c != getShort(code, ip) ) return 0;
|
||||||
ip += 2;
|
ip += 2;
|
||||||
int to = getShort(code, ip);
|
input.consume();
|
||||||
|
break;
|
||||||
|
case Bytecode.RANGE8 :
|
||||||
|
if ( c<code[ip] || c>code[ip+1] ) return 0;
|
||||||
ip += 2;
|
ip += 2;
|
||||||
if ( c<from || c>to ) return 0;
|
input.consume();
|
||||||
|
break;
|
||||||
|
case Bytecode.RANGE16 :
|
||||||
|
if ( c<getShort(code, ip) || c>getShort(code, ip+2) ) return 0;
|
||||||
|
ip += 4;
|
||||||
input.consume();
|
input.consume();
|
||||||
break;
|
break;
|
||||||
case Bytecode.ACCEPT :
|
case Bytecode.ACCEPT :
|
||||||
|
@ -67,7 +86,7 @@ public class Interpreter {
|
||||||
for (int i=1; i<=nopnds-1; i++) {
|
for (int i=1; i<=nopnds-1; i++) {
|
||||||
int addr = getShort(code, ip);
|
int addr = getShort(code, ip);
|
||||||
ip += 2;
|
ip += 2;
|
||||||
System.out.println("try alt "+i+" at "+addr);
|
//System.out.println("try alt "+i+" at "+addr);
|
||||||
int m = input.mark();
|
int m = input.mark();
|
||||||
int r = exec(input, addr);
|
int r = exec(input, addr);
|
||||||
if ( r>0 ) { input.release(m); return r; }
|
if ( r>0 ) { input.release(m); return r; }
|
||||||
|
@ -76,7 +95,7 @@ public class Interpreter {
|
||||||
// try final alternative (w/o recursion)
|
// try final alternative (w/o recursion)
|
||||||
int addr = getShort(code, ip);
|
int addr = getShort(code, ip);
|
||||||
ip = addr;
|
ip = addr;
|
||||||
System.out.println("try alt "+nopnds+" at "+addr);
|
//System.out.println("try alt "+nopnds+" at "+addr);
|
||||||
continue;
|
continue;
|
||||||
default :
|
default :
|
||||||
throw new RuntimeException("invalid instruction @ "+ip+": "+opcode);
|
throw new RuntimeException("invalid instruction @ "+ip+": "+opcode);
|
||||||
|
@ -87,12 +106,10 @@ public class Interpreter {
|
||||||
|
|
||||||
void trace(int ip) {
|
void trace(int ip) {
|
||||||
String instr = Bytecode.disassembleInstruction(code, ip);
|
String instr = Bytecode.disassembleInstruction(code, ip);
|
||||||
System.out.println(instr);
|
System.out.println(instr);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getShort(byte[] memory, int index) {
|
public static int getShort(byte[] memory, int index) {
|
||||||
int b1 = memory[index++]&0xFF; // mask off sign-extended bits
|
return (memory[index]&0xFF) <<(8*1) | (memory[index+1]&0xFF); // prevent sign extension with mask
|
||||||
int b2 = memory[index++]&0xFF;
|
}
|
||||||
return b1<<(8*1) | b2;
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -7,6 +7,7 @@ import org.antlr.v4.automata.DFA;
|
||||||
import org.antlr.v4.automata.LexerNFAFactory;
|
import org.antlr.v4.automata.LexerNFAFactory;
|
||||||
import org.antlr.v4.automata.NFAFactory;
|
import org.antlr.v4.automata.NFAFactory;
|
||||||
import org.antlr.v4.automata.ParserNFAFactory;
|
import org.antlr.v4.automata.ParserNFAFactory;
|
||||||
|
import org.antlr.v4.codegen.CodeGenPipeline;
|
||||||
import org.antlr.v4.parse.ANTLRLexer;
|
import org.antlr.v4.parse.ANTLRLexer;
|
||||||
import org.antlr.v4.parse.ANTLRParser;
|
import org.antlr.v4.parse.ANTLRParser;
|
||||||
import org.antlr.v4.parse.GrammarASTAdaptor;
|
import org.antlr.v4.parse.GrammarASTAdaptor;
|
||||||
|
@ -407,6 +408,8 @@ public class Tool {
|
||||||
if ( generate_DFA_dot ) generateDFAs(g);
|
if ( generate_DFA_dot ) generateDFAs(g);
|
||||||
|
|
||||||
// GENERATE CODE
|
// GENERATE CODE
|
||||||
|
CodeGenPipeline gen = new CodeGenPipeline(g);
|
||||||
|
gen.process();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Move to ast manipulation class?
|
// TODO: Move to ast manipulation class?
|
||||||
|
|
|
@ -68,7 +68,7 @@ public class AnalysisPipeline {
|
||||||
System.out.print("DFA="+dfa);
|
System.out.print("DFA="+dfa);
|
||||||
|
|
||||||
if ( !dfa.valid() ) {
|
if ( !dfa.valid() ) {
|
||||||
System.out.print("invalid DFA");
|
System.out.println("invalid DFA");
|
||||||
}
|
}
|
||||||
|
|
||||||
conv.issueAmbiguityWarnings();
|
conv.issueAmbiguityWarnings();
|
||||||
|
|
|
@ -113,9 +113,9 @@ public class DFA {
|
||||||
|
|
||||||
public boolean valid() {
|
public boolean valid() {
|
||||||
return
|
return
|
||||||
converter.danglingStates.size()==0 &&
|
converter.danglingStates.size()==0;
|
||||||
converter.abortedDueToMultipleRecursiveAltsAt ==null &&
|
// converter.abortedDueToMultipleRecursiveAltsAt ==null &&
|
||||||
converter.recursionOverflowState ==null;
|
// converter.recursionOverflowState ==null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
|
|
@ -259,6 +259,9 @@ public class ParserNFAFactory implements NFAFactory {
|
||||||
}
|
}
|
||||||
Handle first = els.get(0);
|
Handle first = els.get(0);
|
||||||
Handle last = els.get(els.size()-1);
|
Handle last = els.get(els.size()-1);
|
||||||
|
if ( first==null || last==null ) {
|
||||||
|
System.out.println("huh?");
|
||||||
|
}
|
||||||
return new Handle(first.left, last.right);
|
return new Handle(first.left, last.right);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
package org.antlr.v4.codegen;
|
||||||
|
|
||||||
|
import org.antlr.runtime.ANTLRStringStream;
|
||||||
|
import org.antlr.v4.runtime.nfa.NFA;
|
||||||
|
import org.antlr.v4.tool.Grammar;
|
||||||
|
import org.antlr.v4.tool.LexerGrammar;
|
||||||
|
|
||||||
|
public class CodeGenPipeline {
|
||||||
|
Grammar g;
|
||||||
|
public CodeGenPipeline(Grammar g) {
|
||||||
|
this.g = g;
|
||||||
|
}
|
||||||
|
public void process() {
|
||||||
|
if ( g.isLexer() ) processLexer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void processLexer() {
|
||||||
|
LexerGrammar lg = (LexerGrammar)g;
|
||||||
|
for (String modeName : lg.modes.keySet()) { // for each mode
|
||||||
|
NFA nfa = NFABytecodeGenerator.getBytecode(lg, modeName);
|
||||||
|
ANTLRStringStream input = new ANTLRStringStream("32ab");
|
||||||
|
int ttype = nfa.exec(input); System.out.println("ttype="+ttype);
|
||||||
|
ttype = nfa.exec(input); System.out.println("ttype="+ttype);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,30 +2,47 @@ package org.antlr.v4.codegen;
|
||||||
|
|
||||||
import org.antlr.runtime.RecognizerSharedState;
|
import org.antlr.runtime.RecognizerSharedState;
|
||||||
import org.antlr.runtime.Token;
|
import org.antlr.runtime.Token;
|
||||||
|
import org.antlr.runtime.tree.CommonTreeNodeStream;
|
||||||
import org.antlr.runtime.tree.TreeNodeStream;
|
import org.antlr.runtime.tree.TreeNodeStream;
|
||||||
|
import org.antlr.v4.parse.ANTLRParser;
|
||||||
|
import org.antlr.v4.parse.GrammarASTAdaptor;
|
||||||
import org.antlr.v4.runtime.nfa.Bytecode;
|
import org.antlr.v4.runtime.nfa.Bytecode;
|
||||||
|
import org.antlr.v4.runtime.nfa.NFA;
|
||||||
import org.antlr.v4.runtime.tree.TreeParser;
|
import org.antlr.v4.runtime.tree.TreeParser;
|
||||||
|
import org.antlr.v4.tool.GrammarAST;
|
||||||
|
import org.antlr.v4.tool.LexerGrammar;
|
||||||
|
import org.antlr.v4.tool.Rule;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/** http://swtch.com/~rsc/regexp/regexp2.html */
|
/** http://swtch.com/~rsc/regexp/regexp2.html */
|
||||||
public class NFABytecodeGenerator extends TreeParser {
|
public class NFABytecodeGenerator extends TreeParser {
|
||||||
public abstract static class Instr {
|
public abstract static class Instr {
|
||||||
public short opcode;
|
|
||||||
public int addr;
|
public int addr;
|
||||||
public int nBytes;
|
public abstract short opcode();
|
||||||
public Instr(short opcode, int nBytes) { this.opcode = opcode; this.nBytes = nBytes; }
|
public abstract int nBytes();
|
||||||
public void write(byte[] code) { code[addr] = (byte)opcode; }
|
public int charSize(int a, int b) { return Math.max(charSize(a), charSize(b)); }
|
||||||
|
public int charSize(int c) {
|
||||||
|
if ( c<=0xFF ) return 1;
|
||||||
|
if ( c<=0xFFFF ) return 2;
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
public void write(byte[] code) { code[addr] = (byte)opcode(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class MatchInstr extends Instr {
|
public static class MatchInstr extends Instr {
|
||||||
Token token;
|
Token token;
|
||||||
char c;
|
int c;
|
||||||
public MatchInstr(Token t, char c) { super(Bytecode.MATCH, 3); this.token = t; this.c = c; }
|
public MatchInstr(Token t, int c) { super(); this.token = t; this.c = c; }
|
||||||
|
public short opcode() { return charSize(c)==1?Bytecode.MATCH8:Bytecode.MATCH16; };
|
||||||
|
public int nBytes() { return 1+charSize(c); }
|
||||||
public void write(byte[] code) {
|
public void write(byte[] code) {
|
||||||
super.write(code);
|
super.write(code);
|
||||||
writeShort(code, addr+1, (short)c);
|
if ( charSize(c)==1 ) code[addr+1] = (byte)(c&0xFF);
|
||||||
|
else writeShort(code, addr+1, (short)c);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -37,33 +54,41 @@ public class NFABytecodeGenerator extends TreeParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class RangeInstr extends Instr {
|
public static class RangeInstr extends Instr {
|
||||||
Token a, b;
|
Token start, stop;
|
||||||
char start, stop;
|
int a, b;
|
||||||
public RangeInstr(Token a, Token b) {
|
public RangeInstr(Token start, Token stop) {
|
||||||
super(Bytecode.RANGE, 1+2*Bytecode.OPND_SIZE_IN_BYTES);
|
this.start = start;
|
||||||
this.a = a;
|
this.stop = stop;
|
||||||
this.b = b;
|
a = (char)Target.getCharValueFromGrammarCharLiteral(start.getText());
|
||||||
start = (char)Target.getCharValueFromGrammarCharLiteral(a.getText());
|
b = (char)Target.getCharValueFromGrammarCharLiteral(stop.getText());
|
||||||
stop = (char)Target.getCharValueFromGrammarCharLiteral(b.getText());
|
|
||||||
}
|
}
|
||||||
|
public short opcode() { return charSize(a, b)==1?Bytecode.RANGE8:Bytecode.RANGE16; };
|
||||||
|
public int nBytes() { return 1+2*charSize(a, b); }
|
||||||
public void write(byte[] code) {
|
public void write(byte[] code) {
|
||||||
super.write(code);
|
super.write(code);
|
||||||
writeShort(code, addr+1, (short)start);
|
if ( charSize(a,b)==1 ) {
|
||||||
writeShort(code, addr+1+Bytecode.OPND_SIZE_IN_BYTES, (short)stop);
|
code[addr+1] = (byte)(a&0xFF);
|
||||||
|
code[addr+2] = (byte)(b&0xFF);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
writeShort(code, addr+1, (short)a);
|
||||||
|
writeShort(code, addr+1+charSize(a,b), (short)b);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return addr+":RangeInstr{"+start+".."+stop+"}";
|
return addr+":RangeInstr{"+ a +".."+ b +"}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class AcceptInstr extends Instr {
|
public static class AcceptInstr extends Instr {
|
||||||
int ruleIndex;
|
int ruleIndex;
|
||||||
public AcceptInstr(int ruleIndex) {
|
public AcceptInstr(int ruleIndex) {
|
||||||
super(Bytecode.ACCEPT, 3);
|
|
||||||
this.ruleIndex = ruleIndex;
|
this.ruleIndex = ruleIndex;
|
||||||
}
|
}
|
||||||
|
public short opcode() { return Bytecode.ACCEPT; };
|
||||||
|
public int nBytes() { return 1+2; }
|
||||||
public void write(byte[] code) {
|
public void write(byte[] code) {
|
||||||
super.write(code);
|
super.write(code);
|
||||||
writeShort(code, addr+1, (short)ruleIndex);
|
writeShort(code, addr+1, (short)ruleIndex);
|
||||||
|
@ -73,7 +98,8 @@ public class NFABytecodeGenerator extends TreeParser {
|
||||||
|
|
||||||
public static class JumpInstr extends Instr {
|
public static class JumpInstr extends Instr {
|
||||||
int target;
|
int target;
|
||||||
public JumpInstr() { super(Bytecode.JMP, 3); }
|
public short opcode() { return Bytecode.JMP; };
|
||||||
|
public int nBytes() { return 1+Bytecode.ADDR_SIZE; }
|
||||||
public void write(byte[] code) {
|
public void write(byte[] code) {
|
||||||
super.write(code);
|
super.write(code);
|
||||||
writeShort(code, addr+1, (short)target);
|
writeShort(code, addr+1, (short)target);
|
||||||
|
@ -89,15 +115,18 @@ public class NFABytecodeGenerator extends TreeParser {
|
||||||
|
|
||||||
public static class SplitInstr extends Instr {
|
public static class SplitInstr extends Instr {
|
||||||
List<Integer> addrs = new ArrayList<Integer>();
|
List<Integer> addrs = new ArrayList<Integer>();
|
||||||
public SplitInstr(int nAlts) { super(Bytecode.SPLIT, 1+2+nAlts*2); }
|
int nAlts;
|
||||||
|
public SplitInstr(int nAlts) { this.nAlts = nAlts; }
|
||||||
|
public short opcode() { return Bytecode.SPLIT; };
|
||||||
|
public int nBytes() { return 1+2+nAlts*Bytecode.ADDR_SIZE; }
|
||||||
public void write(byte[] code) {
|
public void write(byte[] code) {
|
||||||
super.write(code);
|
super.write(code);
|
||||||
int a = addr + 1;
|
int a = addr + 1;
|
||||||
writeShort(code, a, (short)addrs.size());
|
writeShort(code, a, (short)addrs.size());
|
||||||
a += Bytecode.OPND_SIZE_IN_BYTES;
|
a += 2;
|
||||||
for (int x : addrs) {
|
for (int x : addrs) {
|
||||||
writeShort(code, a, (short)x);
|
writeShort(code, a, (short)x);
|
||||||
a += Bytecode.OPND_SIZE_IN_BYTES;
|
a += Bytecode.ADDR_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +151,7 @@ public class NFABytecodeGenerator extends TreeParser {
|
||||||
|
|
||||||
public void emit(Instr I) {
|
public void emit(Instr I) {
|
||||||
I.addr = ip;
|
I.addr = ip;
|
||||||
ip += I.nBytes;
|
ip += I.nBytes();
|
||||||
instrs.add(I);
|
instrs.add(I);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,9 +162,24 @@ public class NFABytecodeGenerator extends TreeParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] getCode() {
|
/** Given any block of alts, return list of instruction objects */
|
||||||
|
public static List<Instr> getInstructions(GrammarAST blk, int acceptValue) {
|
||||||
|
GrammarASTAdaptor adaptor = new GrammarASTAdaptor();
|
||||||
|
CommonTreeNodeStream nodes = new CommonTreeNodeStream(adaptor,blk);
|
||||||
|
NFABytecodeTriggers gen = new NFABytecodeTriggers(nodes);
|
||||||
|
try {
|
||||||
|
gen.block();
|
||||||
|
gen.emit(new NFABytecodeGenerator.AcceptInstr(acceptValue));
|
||||||
|
}
|
||||||
|
catch (Exception e){
|
||||||
|
e.printStackTrace(System.err);
|
||||||
|
}
|
||||||
|
return gen.instrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] getByteCode(List<Instr> instrs) {
|
||||||
Instr last = instrs.get(instrs.size() - 1);
|
Instr last = instrs.get(instrs.size() - 1);
|
||||||
int size = last.addr + last.nBytes;
|
int size = last.addr + last.nBytes();
|
||||||
byte[] code = new byte[size];
|
byte[] code = new byte[size];
|
||||||
for (Instr I : instrs) {
|
for (Instr I : instrs) {
|
||||||
I.write(code);
|
I.write(code);
|
||||||
|
@ -143,6 +187,42 @@ public class NFABytecodeGenerator extends TreeParser {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static NFA getBytecode(LexerGrammar lg, String modeName) {
|
||||||
|
GrammarASTAdaptor adaptor = new GrammarASTAdaptor();
|
||||||
|
NFABytecodeTriggers gen = new NFABytecodeTriggers(null);
|
||||||
|
|
||||||
|
// add split for s0 to hook up rules (fill in operands as we gen rules)
|
||||||
|
int numRules = lg.modes.get(modeName).size();
|
||||||
|
int numFragmentRules = 0;
|
||||||
|
for (Rule r : lg.modes.get(modeName)) { if ( r.isFragment() ) numFragmentRules++; }
|
||||||
|
SplitInstr s0 = new SplitInstr(numRules - numFragmentRules);
|
||||||
|
gen.emit(s0);
|
||||||
|
|
||||||
|
Map<String, Integer> ruleToAddr = new HashMap<String, Integer>();
|
||||||
|
for (Rule r : lg.modes.get(modeName)) { // for each rule in mode
|
||||||
|
GrammarAST blk = (GrammarAST)r.ast.getFirstChildWithType(ANTLRParser.BLOCK);
|
||||||
|
CommonTreeNodeStream nodes = new CommonTreeNodeStream(adaptor,blk);
|
||||||
|
gen.setTreeNodeStream(nodes);
|
||||||
|
ruleToAddr.put(r.name, gen.ip);
|
||||||
|
if ( !r.isFragment() ) s0.addrs.add(gen.ip);
|
||||||
|
try {
|
||||||
|
gen.block();
|
||||||
|
int ruleTokenType = lg.getTokenType(r.name);
|
||||||
|
gen.emit(new NFABytecodeGenerator.AcceptInstr(ruleTokenType));
|
||||||
|
}
|
||||||
|
catch (Exception e){
|
||||||
|
e.printStackTrace(System.err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
byte[] code = NFABytecodeGenerator.getByteCode(gen.instrs);
|
||||||
|
System.out.println("all:");
|
||||||
|
System.out.println(Bytecode.disassemble(code));
|
||||||
|
System.out.println("rule addrs="+ruleToAddr);
|
||||||
|
|
||||||
|
NFA nfa = new NFA(code, ruleToAddr);
|
||||||
|
return nfa;
|
||||||
|
}
|
||||||
|
|
||||||
/** Write value at index into a byte array highest to lowest byte,
|
/** Write value at index into a byte array highest to lowest byte,
|
||||||
* left to right.
|
* left to right.
|
||||||
*/
|
*/
|
||||||
|
@ -151,30 +231,4 @@ public class NFABytecodeGenerator extends TreeParser {
|
||||||
memory[index+1] = (byte)(value&0xFF);
|
memory[index+1] = (byte)(value&0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* CODE TO GENERATE NFA BYTECODES
|
|
||||||
// testing code gen concept
|
|
||||||
GrammarASTAdaptor adaptor = new GrammarASTAdaptor();
|
|
||||||
for (Rule r : lg.modes.get(modeName)) {
|
|
||||||
GrammarAST blk = (GrammarAST)r.ast.getFirstChildWithType(ANTLRParser.BLOCK);
|
|
||||||
CommonTreeNodeStream nodes = new CommonTreeNodeStream(adaptor,blk);
|
|
||||||
NFABytecodeTriggers gen = new NFABytecodeTriggers(nodes);
|
|
||||||
try {
|
|
||||||
gen.block();
|
|
||||||
gen.emit(new NFABytecodeGenerator.AcceptInstr(r.index));
|
|
||||||
System.out.println("code=\n"+gen.instrs);
|
|
||||||
byte[] code = gen.getCode();
|
|
||||||
System.out.println(Bytecode.disassemble(code));
|
|
||||||
Interpreter in = new Interpreter(code);
|
|
||||||
String s = "i";
|
|
||||||
ANTLRStringStream input = new ANTLRStringStream(s);
|
|
||||||
int rule = in.exec(input, 0);
|
|
||||||
System.out.println(s+" matched rule "+rule+" leaving off at index="+input.index());
|
|
||||||
}
|
|
||||||
catch (Exception e){
|
|
||||||
e.printStackTrace(System.err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// $ANTLR ${project.version} ${buildNumber} NFABytecodeTriggers.g 2010-04-21 13:15:49
|
// $ANTLR ${project.version} ${buildNumber} NFABytecodeTriggers.g 2010-04-29 12:03:06
|
||||||
|
|
||||||
package org.antlr.v4.codegen;
|
package org.antlr.v4.codegen;
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ import org.stringtemplate.v4.misc.MultiMap;
|
||||||
|
|
||||||
@members {
|
@members {
|
||||||
Rule currentRule;
|
Rule currentRule;
|
||||||
String currentMode = Grammar.DEFAULT_MODE_NAME;
|
String currentMode = LexerGrammar.DEFAULT_MODE_NAME;
|
||||||
int currentAlt = 1; // 1..n
|
int currentAlt = 1; // 1..n
|
||||||
public List<Rule> rules = new ArrayList<Rule>();
|
public List<Rule> rules = new ArrayList<Rule>();
|
||||||
public List<GrammarAST> rulerefs = new ArrayList<GrammarAST>();
|
public List<GrammarAST> rulerefs = new ArrayList<GrammarAST>();
|
||||||
|
@ -149,6 +149,7 @@ rule
|
||||||
: ^( RULE
|
: ^( RULE
|
||||||
name=ID (options {greedy=false;}:.)*
|
name=ID (options {greedy=false;}:.)*
|
||||||
(^(RULEMODIFIERS (m=. {modifiers.add($m);})+))?
|
(^(RULEMODIFIERS (m=. {modifiers.add($m);})+))?
|
||||||
|
(^(AT ID ACTION))*
|
||||||
^(BLOCK .+)
|
^(BLOCK .+)
|
||||||
.*
|
.*
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// $ANTLR ${project.version} ${buildNumber} CollectSymbols.g 2010-04-19 17:33:29
|
// $ANTLR ${project.version} ${buildNumber} CollectSymbols.g 2010-04-28 18:42:02
|
||||||
|
|
||||||
/*
|
/*
|
||||||
[The "BSD license"]
|
[The "BSD license"]
|
||||||
|
@ -37,7 +37,6 @@ import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/** Collects rules, terminals, strings, actions, scopes etc... from AST
|
/** Collects rules, terminals, strings, actions, scopes etc... from AST
|
||||||
* Side-effects: None
|
* Side-effects: None
|
||||||
*/
|
*/
|
||||||
|
@ -670,7 +669,7 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
|
|
||||||
|
|
||||||
// $ANTLR start "rule"
|
// $ANTLR start "rule"
|
||||||
// CollectSymbols.g:147:1: rule : ^( RULE name= ID ( options {greedy=false; } : . )* ( ^( RULEMODIFIERS (m= . )+ ) )? ^( BLOCK ( . )+ ) ( . )* ) ;
|
// CollectSymbols.g:147:1: rule : ^( RULE name= ID ( options {greedy=false; } : . )* ( ^( RULEMODIFIERS (m= . )+ ) )? ( ^( AT ID ACTION ) )* ^( BLOCK ( . )+ ) ( . )* ) ;
|
||||||
public final void rule() throws RecognitionException {
|
public final void rule() throws RecognitionException {
|
||||||
GrammarAST name=null;
|
GrammarAST name=null;
|
||||||
GrammarAST RULE8=null;
|
GrammarAST RULE8=null;
|
||||||
|
@ -678,8 +677,8 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
|
|
||||||
List<GrammarAST> modifiers = new ArrayList<GrammarAST>();
|
List<GrammarAST> modifiers = new ArrayList<GrammarAST>();
|
||||||
try {
|
try {
|
||||||
// CollectSymbols.g:149:2: ( ^( RULE name= ID ( options {greedy=false; } : . )* ( ^( RULEMODIFIERS (m= . )+ ) )? ^( BLOCK ( . )+ ) ( . )* ) )
|
// CollectSymbols.g:149:2: ( ^( RULE name= ID ( options {greedy=false; } : . )* ( ^( RULEMODIFIERS (m= . )+ ) )? ( ^( AT ID ACTION ) )* ^( BLOCK ( . )+ ) ( . )* ) )
|
||||||
// CollectSymbols.g:149:6: ^( RULE name= ID ( options {greedy=false; } : . )* ( ^( RULEMODIFIERS (m= . )+ ) )? ^( BLOCK ( . )+ ) ( . )* )
|
// CollectSymbols.g:149:6: ^( RULE name= ID ( options {greedy=false; } : . )* ( ^( RULEMODIFIERS (m= . )+ ) )? ( ^( AT ID ACTION ) )* ^( BLOCK ( . )+ ) ( . )* )
|
||||||
{
|
{
|
||||||
RULE8=(GrammarAST)match(input,RULE,FOLLOW_RULE_in_rule382); if (state.failed) return ;
|
RULE8=(GrammarAST)match(input,RULE,FOLLOW_RULE_in_rule382); if (state.failed) return ;
|
||||||
|
|
||||||
|
@ -761,46 +760,42 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
match(input,BLOCK,FOLLOW_BLOCK_in_rule441); if (state.failed) return ;
|
// CollectSymbols.g:152:9: ( ^( AT ID ACTION ) )*
|
||||||
|
|
||||||
match(input, Token.DOWN, null); if (state.failed) return ;
|
|
||||||
// CollectSymbols.g:152:17: ( . )+
|
|
||||||
int cnt8=0;
|
|
||||||
loop8:
|
loop8:
|
||||||
do {
|
do {
|
||||||
int alt8=2;
|
int alt8=2;
|
||||||
int LA8_0 = input.LA(1);
|
int LA8_0 = input.LA(1);
|
||||||
|
|
||||||
if ( ((LA8_0>=SEMPRED && LA8_0<=ALT_REWRITE)) ) {
|
if ( (LA8_0==AT) ) {
|
||||||
alt8=1;
|
alt8=1;
|
||||||
}
|
}
|
||||||
else if ( (LA8_0==UP) ) {
|
|
||||||
alt8=2;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
switch (alt8) {
|
switch (alt8) {
|
||||||
case 1 :
|
case 1 :
|
||||||
// CollectSymbols.g:152:17: .
|
// CollectSymbols.g:152:10: ^( AT ID ACTION )
|
||||||
{
|
{
|
||||||
matchAny(input); if (state.failed) return ;
|
match(input,AT,FOLLOW_AT_in_rule442); if (state.failed) return ;
|
||||||
|
|
||||||
|
match(input, Token.DOWN, null); if (state.failed) return ;
|
||||||
|
match(input,ID,FOLLOW_ID_in_rule444); if (state.failed) return ;
|
||||||
|
match(input,ACTION,FOLLOW_ACTION_in_rule446); if (state.failed) return ;
|
||||||
|
|
||||||
|
match(input, Token.UP, null); if (state.failed) return ;
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default :
|
default :
|
||||||
if ( cnt8 >= 1 ) break loop8;
|
break loop8;
|
||||||
if (state.backtracking>0) {state.failed=true; return ;}
|
|
||||||
EarlyExitException eee =
|
|
||||||
new EarlyExitException(8, input);
|
|
||||||
throw eee;
|
|
||||||
}
|
}
|
||||||
cnt8++;
|
|
||||||
} while (true);
|
} while (true);
|
||||||
|
|
||||||
|
match(input,BLOCK,FOLLOW_BLOCK_in_rule460); if (state.failed) return ;
|
||||||
|
|
||||||
match(input, Token.UP, null); if (state.failed) return ;
|
match(input, Token.DOWN, null); if (state.failed) return ;
|
||||||
// CollectSymbols.g:153:9: ( . )*
|
// CollectSymbols.g:153:17: ( . )+
|
||||||
|
int cnt9=0;
|
||||||
loop9:
|
loop9:
|
||||||
do {
|
do {
|
||||||
int alt9=2;
|
int alt9=2;
|
||||||
|
@ -816,7 +811,7 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
|
|
||||||
switch (alt9) {
|
switch (alt9) {
|
||||||
case 1 :
|
case 1 :
|
||||||
// CollectSymbols.g:153:9: .
|
// CollectSymbols.g:153:17: .
|
||||||
{
|
{
|
||||||
matchAny(input); if (state.failed) return ;
|
matchAny(input); if (state.failed) return ;
|
||||||
|
|
||||||
|
@ -824,7 +819,42 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default :
|
default :
|
||||||
break loop9;
|
if ( cnt9 >= 1 ) break loop9;
|
||||||
|
if (state.backtracking>0) {state.failed=true; return ;}
|
||||||
|
EarlyExitException eee =
|
||||||
|
new EarlyExitException(9, input);
|
||||||
|
throw eee;
|
||||||
|
}
|
||||||
|
cnt9++;
|
||||||
|
} while (true);
|
||||||
|
|
||||||
|
|
||||||
|
match(input, Token.UP, null); if (state.failed) return ;
|
||||||
|
// CollectSymbols.g:154:9: ( . )*
|
||||||
|
loop10:
|
||||||
|
do {
|
||||||
|
int alt10=2;
|
||||||
|
int LA10_0 = input.LA(1);
|
||||||
|
|
||||||
|
if ( ((LA10_0>=SEMPRED && LA10_0<=ALT_REWRITE)) ) {
|
||||||
|
alt10=1;
|
||||||
|
}
|
||||||
|
else if ( (LA10_0==UP) ) {
|
||||||
|
alt10=2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
switch (alt10) {
|
||||||
|
case 1 :
|
||||||
|
// CollectSymbols.g:154:9: .
|
||||||
|
{
|
||||||
|
matchAny(input); if (state.failed) return ;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default :
|
||||||
|
break loop10;
|
||||||
}
|
}
|
||||||
} while (true);
|
} while (true);
|
||||||
|
|
||||||
|
@ -835,7 +865,6 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
int numAlts = RULE8.getFirstChildWithType(BLOCK).getChildCount();
|
int numAlts = RULE8.getFirstChildWithType(BLOCK).getChildCount();
|
||||||
Rule r = new Rule(g, (name!=null?name.getText():null), (GrammarASTWithOptions)RULE8, numAlts);
|
Rule r = new Rule(g, (name!=null?name.getText():null), (GrammarASTWithOptions)RULE8, numAlts);
|
||||||
if ( g.isLexer() ) r.mode = currentMode;
|
if ( g.isLexer() ) r.mode = currentMode;
|
||||||
else r.mode = LexerGrammar.DEFAULT_MODE_NAME;
|
|
||||||
if ( modifiers.size()>0 ) r.modifiers = modifiers;
|
if ( modifiers.size()>0 ) r.modifiers = modifiers;
|
||||||
rules.add(r);
|
rules.add(r);
|
||||||
currentRule = r;
|
currentRule = r;
|
||||||
|
@ -908,7 +937,7 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
// CollectSymbols.g:173:2: ( RULE )
|
// CollectSymbols.g:173:2: ( RULE )
|
||||||
// CollectSymbols.g:173:4: RULE
|
// CollectSymbols.g:173:4: RULE
|
||||||
{
|
{
|
||||||
match(input,RULE,FOLLOW_RULE_in_finishRule508); if (state.failed) return ;
|
match(input,RULE,FOLLOW_RULE_in_finishRule527); if (state.failed) return ;
|
||||||
if ( state.backtracking==1 ) {
|
if ( state.backtracking==1 ) {
|
||||||
currentRule = null;
|
currentRule = null;
|
||||||
}
|
}
|
||||||
|
@ -941,11 +970,11 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
if (state.backtracking>0) {state.failed=true; return ;}
|
if (state.backtracking>0) {state.failed=true; return ;}
|
||||||
throw new FailedPredicateException(input, "ruleNamedAction", "inContext(\"RULE\")");
|
throw new FailedPredicateException(input, "ruleNamedAction", "inContext(\"RULE\")");
|
||||||
}
|
}
|
||||||
match(input,AT,FOLLOW_AT_in_ruleNamedAction524); if (state.failed) return ;
|
match(input,AT,FOLLOW_AT_in_ruleNamedAction543); if (state.failed) return ;
|
||||||
|
|
||||||
match(input, Token.DOWN, null); if (state.failed) return ;
|
match(input, Token.DOWN, null); if (state.failed) return ;
|
||||||
ID9=(GrammarAST)match(input,ID,FOLLOW_ID_in_ruleNamedAction526); if (state.failed) return ;
|
ID9=(GrammarAST)match(input,ID,FOLLOW_ID_in_ruleNamedAction545); if (state.failed) return ;
|
||||||
ACTION10=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_ruleNamedAction528); if (state.failed) return ;
|
ACTION10=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_ruleNamedAction547); if (state.failed) return ;
|
||||||
|
|
||||||
match(input, Token.UP, null); if (state.failed) return ;
|
match(input, Token.UP, null); if (state.failed) return ;
|
||||||
if ( state.backtracking==1 ) {
|
if ( state.backtracking==1 ) {
|
||||||
|
@ -983,7 +1012,7 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
if (state.backtracking>0) {state.failed=true; return ;}
|
if (state.backtracking>0) {state.failed=true; return ;}
|
||||||
throw new FailedPredicateException(input, "ruleAction", "inContext(\"RULE ...\")&&!inContext(\"SCOPE\")&&\n\t\t !inContext(\"CATCH\")&&!inContext(\"FINALLY\")&&!inContext(\"AT\")");
|
throw new FailedPredicateException(input, "ruleAction", "inContext(\"RULE ...\")&&!inContext(\"SCOPE\")&&\n\t\t !inContext(\"CATCH\")&&!inContext(\"FINALLY\")&&!inContext(\"AT\")");
|
||||||
}
|
}
|
||||||
ACTION11=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_ruleAction548); if (state.failed) return ;
|
ACTION11=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_ruleAction567); if (state.failed) return ;
|
||||||
if ( state.backtracking==1 ) {
|
if ( state.backtracking==1 ) {
|
||||||
|
|
||||||
currentRule.alt[currentAlt].actions.add((ActionAST)ACTION11);
|
currentRule.alt[currentAlt].actions.add((ActionAST)ACTION11);
|
||||||
|
@ -1014,11 +1043,11 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
// CollectSymbols.g:195:2: ( ^( CATCH ARG_ACTION ACTION ) )
|
// CollectSymbols.g:195:2: ( ^( CATCH ARG_ACTION ACTION ) )
|
||||||
// CollectSymbols.g:195:4: ^( CATCH ARG_ACTION ACTION )
|
// CollectSymbols.g:195:4: ^( CATCH ARG_ACTION ACTION )
|
||||||
{
|
{
|
||||||
match(input,CATCH,FOLLOW_CATCH_in_exceptionHandler564); if (state.failed) return ;
|
match(input,CATCH,FOLLOW_CATCH_in_exceptionHandler583); if (state.failed) return ;
|
||||||
|
|
||||||
match(input, Token.DOWN, null); if (state.failed) return ;
|
match(input, Token.DOWN, null); if (state.failed) return ;
|
||||||
match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_exceptionHandler566); if (state.failed) return ;
|
match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_exceptionHandler585); if (state.failed) return ;
|
||||||
ACTION12=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_exceptionHandler568); if (state.failed) return ;
|
ACTION12=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_exceptionHandler587); if (state.failed) return ;
|
||||||
|
|
||||||
match(input, Token.UP, null); if (state.failed) return ;
|
match(input, Token.UP, null); if (state.failed) return ;
|
||||||
if ( state.backtracking==1 ) {
|
if ( state.backtracking==1 ) {
|
||||||
|
@ -1051,10 +1080,10 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
// CollectSymbols.g:203:2: ( ^( FINALLY ACTION ) )
|
// CollectSymbols.g:203:2: ( ^( FINALLY ACTION ) )
|
||||||
// CollectSymbols.g:203:4: ^( FINALLY ACTION )
|
// CollectSymbols.g:203:4: ^( FINALLY ACTION )
|
||||||
{
|
{
|
||||||
match(input,FINALLY,FOLLOW_FINALLY_in_finallyClause585); if (state.failed) return ;
|
match(input,FINALLY,FOLLOW_FINALLY_in_finallyClause604); if (state.failed) return ;
|
||||||
|
|
||||||
match(input, Token.DOWN, null); if (state.failed) return ;
|
match(input, Token.DOWN, null); if (state.failed) return ;
|
||||||
ACTION13=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_finallyClause587); if (state.failed) return ;
|
ACTION13=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_finallyClause606); if (state.failed) return ;
|
||||||
|
|
||||||
match(input, Token.UP, null); if (state.failed) return ;
|
match(input, Token.UP, null); if (state.failed) return ;
|
||||||
if ( state.backtracking==1 ) {
|
if ( state.backtracking==1 ) {
|
||||||
|
@ -1091,7 +1120,7 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
if (state.backtracking>0) {state.failed=true; return ;}
|
if (state.backtracking>0) {state.failed=true; return ;}
|
||||||
throw new FailedPredicateException(input, "ruleArg", "inContext(\"RULE\")");
|
throw new FailedPredicateException(input, "ruleArg", "inContext(\"RULE\")");
|
||||||
}
|
}
|
||||||
ARG_ACTION14=(GrammarAST)match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_ruleArg607); if (state.failed) return ;
|
ARG_ACTION14=(GrammarAST)match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_ruleArg626); if (state.failed) return ;
|
||||||
if ( state.backtracking==1 ) {
|
if ( state.backtracking==1 ) {
|
||||||
|
|
||||||
currentRule.args = ScopeParser.parseTypeList((ARG_ACTION14!=null?ARG_ACTION14.getText():null));
|
currentRule.args = ScopeParser.parseTypeList((ARG_ACTION14!=null?ARG_ACTION14.getText():null));
|
||||||
|
@ -1122,10 +1151,10 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
// CollectSymbols.g:219:2: ( ^( RETURNS ARG_ACTION ) )
|
// CollectSymbols.g:219:2: ( ^( RETURNS ARG_ACTION ) )
|
||||||
// CollectSymbols.g:219:4: ^( RETURNS ARG_ACTION )
|
// CollectSymbols.g:219:4: ^( RETURNS ARG_ACTION )
|
||||||
{
|
{
|
||||||
match(input,RETURNS,FOLLOW_RETURNS_in_ruleReturns624); if (state.failed) return ;
|
match(input,RETURNS,FOLLOW_RETURNS_in_ruleReturns643); if (state.failed) return ;
|
||||||
|
|
||||||
match(input, Token.DOWN, null); if (state.failed) return ;
|
match(input, Token.DOWN, null); if (state.failed) return ;
|
||||||
ARG_ACTION15=(GrammarAST)match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_ruleReturns626); if (state.failed) return ;
|
ARG_ACTION15=(GrammarAST)match(input,ARG_ACTION,FOLLOW_ARG_ACTION_in_ruleReturns645); if (state.failed) return ;
|
||||||
|
|
||||||
match(input, Token.UP, null); if (state.failed) return ;
|
match(input, Token.UP, null); if (state.failed) return ;
|
||||||
if ( state.backtracking==1 ) {
|
if ( state.backtracking==1 ) {
|
||||||
|
@ -1165,25 +1194,25 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
throw new FailedPredicateException(input, "ruleScopeSpec", "inContext(\"RULE\")");
|
throw new FailedPredicateException(input, "ruleScopeSpec", "inContext(\"RULE\")");
|
||||||
}
|
}
|
||||||
// CollectSymbols.g:228:3: ( ^( SCOPE ACTION ) | ^( SCOPE (ids+= ID )+ ) )
|
// CollectSymbols.g:228:3: ( ^( SCOPE ACTION ) | ^( SCOPE (ids+= ID )+ ) )
|
||||||
int alt11=2;
|
int alt12=2;
|
||||||
int LA11_0 = input.LA(1);
|
int LA12_0 = input.LA(1);
|
||||||
|
|
||||||
if ( (LA11_0==SCOPE) ) {
|
if ( (LA12_0==SCOPE) ) {
|
||||||
int LA11_1 = input.LA(2);
|
int LA12_1 = input.LA(2);
|
||||||
|
|
||||||
if ( (LA11_1==DOWN) ) {
|
if ( (LA12_1==DOWN) ) {
|
||||||
int LA11_2 = input.LA(3);
|
int LA12_2 = input.LA(3);
|
||||||
|
|
||||||
if ( (LA11_2==ACTION) ) {
|
if ( (LA12_2==ACTION) ) {
|
||||||
alt11=1;
|
alt12=1;
|
||||||
}
|
}
|
||||||
else if ( (LA11_2==ID) ) {
|
else if ( (LA12_2==ID) ) {
|
||||||
alt11=2;
|
alt12=2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (state.backtracking>0) {state.failed=true; return ;}
|
if (state.backtracking>0) {state.failed=true; return ;}
|
||||||
NoViableAltException nvae =
|
NoViableAltException nvae =
|
||||||
new NoViableAltException("", 11, 2, input);
|
new NoViableAltException("", 12, 2, input);
|
||||||
|
|
||||||
throw nvae;
|
throw nvae;
|
||||||
}
|
}
|
||||||
|
@ -1191,7 +1220,7 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
else {
|
else {
|
||||||
if (state.backtracking>0) {state.failed=true; return ;}
|
if (state.backtracking>0) {state.failed=true; return ;}
|
||||||
NoViableAltException nvae =
|
NoViableAltException nvae =
|
||||||
new NoViableAltException("", 11, 1, input);
|
new NoViableAltException("", 12, 1, input);
|
||||||
|
|
||||||
throw nvae;
|
throw nvae;
|
||||||
}
|
}
|
||||||
|
@ -1199,18 +1228,18 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
else {
|
else {
|
||||||
if (state.backtracking>0) {state.failed=true; return ;}
|
if (state.backtracking>0) {state.failed=true; return ;}
|
||||||
NoViableAltException nvae =
|
NoViableAltException nvae =
|
||||||
new NoViableAltException("", 11, 0, input);
|
new NoViableAltException("", 12, 0, input);
|
||||||
|
|
||||||
throw nvae;
|
throw nvae;
|
||||||
}
|
}
|
||||||
switch (alt11) {
|
switch (alt12) {
|
||||||
case 1 :
|
case 1 :
|
||||||
// CollectSymbols.g:228:5: ^( SCOPE ACTION )
|
// CollectSymbols.g:228:5: ^( SCOPE ACTION )
|
||||||
{
|
{
|
||||||
match(input,SCOPE,FOLLOW_SCOPE_in_ruleScopeSpec649); if (state.failed) return ;
|
match(input,SCOPE,FOLLOW_SCOPE_in_ruleScopeSpec668); if (state.failed) return ;
|
||||||
|
|
||||||
match(input, Token.DOWN, null); if (state.failed) return ;
|
match(input, Token.DOWN, null); if (state.failed) return ;
|
||||||
ACTION16=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_ruleScopeSpec651); if (state.failed) return ;
|
ACTION16=(GrammarAST)match(input,ACTION,FOLLOW_ACTION_in_ruleScopeSpec670); if (state.failed) return ;
|
||||||
|
|
||||||
match(input, Token.UP, null); if (state.failed) return ;
|
match(input, Token.UP, null); if (state.failed) return ;
|
||||||
if ( state.backtracking==1 ) {
|
if ( state.backtracking==1 ) {
|
||||||
|
@ -1226,26 +1255,26 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
case 2 :
|
case 2 :
|
||||||
// CollectSymbols.g:234:5: ^( SCOPE (ids+= ID )+ )
|
// CollectSymbols.g:234:5: ^( SCOPE (ids+= ID )+ )
|
||||||
{
|
{
|
||||||
match(input,SCOPE,FOLLOW_SCOPE_in_ruleScopeSpec664); if (state.failed) return ;
|
match(input,SCOPE,FOLLOW_SCOPE_in_ruleScopeSpec683); if (state.failed) return ;
|
||||||
|
|
||||||
match(input, Token.DOWN, null); if (state.failed) return ;
|
match(input, Token.DOWN, null); if (state.failed) return ;
|
||||||
// CollectSymbols.g:234:16: (ids+= ID )+
|
// CollectSymbols.g:234:16: (ids+= ID )+
|
||||||
int cnt10=0;
|
int cnt11=0;
|
||||||
loop10:
|
loop11:
|
||||||
do {
|
do {
|
||||||
int alt10=2;
|
int alt11=2;
|
||||||
int LA10_0 = input.LA(1);
|
int LA11_0 = input.LA(1);
|
||||||
|
|
||||||
if ( (LA10_0==ID) ) {
|
if ( (LA11_0==ID) ) {
|
||||||
alt10=1;
|
alt11=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
switch (alt10) {
|
switch (alt11) {
|
||||||
case 1 :
|
case 1 :
|
||||||
// CollectSymbols.g:234:16: ids+= ID
|
// CollectSymbols.g:234:16: ids+= ID
|
||||||
{
|
{
|
||||||
ids=(GrammarAST)match(input,ID,FOLLOW_ID_in_ruleScopeSpec668); if (state.failed) return ;
|
ids=(GrammarAST)match(input,ID,FOLLOW_ID_in_ruleScopeSpec687); if (state.failed) return ;
|
||||||
if (list_ids==null) list_ids=new ArrayList();
|
if (list_ids==null) list_ids=new ArrayList();
|
||||||
list_ids.add(ids);
|
list_ids.add(ids);
|
||||||
|
|
||||||
|
@ -1254,13 +1283,13 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default :
|
default :
|
||||||
if ( cnt10 >= 1 ) break loop10;
|
if ( cnt11 >= 1 ) break loop11;
|
||||||
if (state.backtracking>0) {state.failed=true; return ;}
|
if (state.backtracking>0) {state.failed=true; return ;}
|
||||||
EarlyExitException eee =
|
EarlyExitException eee =
|
||||||
new EarlyExitException(10, input);
|
new EarlyExitException(11, input);
|
||||||
throw eee;
|
throw eee;
|
||||||
}
|
}
|
||||||
cnt10++;
|
cnt11++;
|
||||||
} while (true);
|
} while (true);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1353,30 +1382,30 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
throw new FailedPredicateException(input, "labeledElement", "inContext(\"RULE ...\")");
|
throw new FailedPredicateException(input, "labeledElement", "inContext(\"RULE ...\")");
|
||||||
}
|
}
|
||||||
// CollectSymbols.g:252:3: ( ^( ASSIGN id= ID e= . ) | ^( PLUS_ASSIGN id= ID e= . ) )
|
// CollectSymbols.g:252:3: ( ^( ASSIGN id= ID e= . ) | ^( PLUS_ASSIGN id= ID e= . ) )
|
||||||
int alt12=2;
|
int alt13=2;
|
||||||
int LA12_0 = input.LA(1);
|
int LA13_0 = input.LA(1);
|
||||||
|
|
||||||
if ( (LA12_0==ASSIGN) ) {
|
if ( (LA13_0==ASSIGN) ) {
|
||||||
alt12=1;
|
alt13=1;
|
||||||
}
|
}
|
||||||
else if ( (LA12_0==PLUS_ASSIGN) ) {
|
else if ( (LA13_0==PLUS_ASSIGN) ) {
|
||||||
alt12=2;
|
alt13=2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (state.backtracking>0) {state.failed=true; return retval;}
|
if (state.backtracking>0) {state.failed=true; return retval;}
|
||||||
NoViableAltException nvae =
|
NoViableAltException nvae =
|
||||||
new NoViableAltException("", 12, 0, input);
|
new NoViableAltException("", 13, 0, input);
|
||||||
|
|
||||||
throw nvae;
|
throw nvae;
|
||||||
}
|
}
|
||||||
switch (alt12) {
|
switch (alt13) {
|
||||||
case 1 :
|
case 1 :
|
||||||
// CollectSymbols.g:252:5: ^( ASSIGN id= ID e= . )
|
// CollectSymbols.g:252:5: ^( ASSIGN id= ID e= . )
|
||||||
{
|
{
|
||||||
match(input,ASSIGN,FOLLOW_ASSIGN_in_labeledElement732); if (state.failed) return retval;
|
match(input,ASSIGN,FOLLOW_ASSIGN_in_labeledElement751); if (state.failed) return retval;
|
||||||
|
|
||||||
match(input, Token.DOWN, null); if (state.failed) return retval;
|
match(input, Token.DOWN, null); if (state.failed) return retval;
|
||||||
id=(GrammarAST)match(input,ID,FOLLOW_ID_in_labeledElement736); if (state.failed) return retval;
|
id=(GrammarAST)match(input,ID,FOLLOW_ID_in_labeledElement755); if (state.failed) return retval;
|
||||||
e=(GrammarAST)input.LT(1);
|
e=(GrammarAST)input.LT(1);
|
||||||
matchAny(input); if (state.failed) return retval;
|
matchAny(input); if (state.failed) return retval;
|
||||||
|
|
||||||
|
@ -1387,10 +1416,10 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
case 2 :
|
case 2 :
|
||||||
// CollectSymbols.g:253:5: ^( PLUS_ASSIGN id= ID e= . )
|
// CollectSymbols.g:253:5: ^( PLUS_ASSIGN id= ID e= . )
|
||||||
{
|
{
|
||||||
match(input,PLUS_ASSIGN,FOLLOW_PLUS_ASSIGN_in_labeledElement748); if (state.failed) return retval;
|
match(input,PLUS_ASSIGN,FOLLOW_PLUS_ASSIGN_in_labeledElement767); if (state.failed) return retval;
|
||||||
|
|
||||||
match(input, Token.DOWN, null); if (state.failed) return retval;
|
match(input, Token.DOWN, null); if (state.failed) return retval;
|
||||||
id=(GrammarAST)match(input,ID,FOLLOW_ID_in_labeledElement752); if (state.failed) return retval;
|
id=(GrammarAST)match(input,ID,FOLLOW_ID_in_labeledElement771); if (state.failed) return retval;
|
||||||
e=(GrammarAST)input.LT(1);
|
e=(GrammarAST)input.LT(1);
|
||||||
matchAny(input); if (state.failed) return retval;
|
matchAny(input); if (state.failed) return retval;
|
||||||
|
|
||||||
|
@ -1436,23 +1465,23 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// CollectSymbols.g:258:5: ({...}? STRING_LITERAL | TOKEN_REF )
|
// CollectSymbols.g:258:5: ({...}? STRING_LITERAL | TOKEN_REF )
|
||||||
int alt13=2;
|
int alt14=2;
|
||||||
int LA13_0 = input.LA(1);
|
int LA14_0 = input.LA(1);
|
||||||
|
|
||||||
if ( (LA13_0==STRING_LITERAL) ) {
|
if ( (LA14_0==STRING_LITERAL) ) {
|
||||||
alt13=1;
|
alt14=1;
|
||||||
}
|
}
|
||||||
else if ( (LA13_0==TOKEN_REF) ) {
|
else if ( (LA14_0==TOKEN_REF) ) {
|
||||||
alt13=2;
|
alt14=2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (state.backtracking>0) {state.failed=true; return retval;}
|
if (state.backtracking>0) {state.failed=true; return retval;}
|
||||||
NoViableAltException nvae =
|
NoViableAltException nvae =
|
||||||
new NoViableAltException("", 13, 0, input);
|
new NoViableAltException("", 14, 0, input);
|
||||||
|
|
||||||
throw nvae;
|
throw nvae;
|
||||||
}
|
}
|
||||||
switch (alt13) {
|
switch (alt14) {
|
||||||
case 1 :
|
case 1 :
|
||||||
// CollectSymbols.g:258:7: {...}? STRING_LITERAL
|
// CollectSymbols.g:258:7: {...}? STRING_LITERAL
|
||||||
{
|
{
|
||||||
|
@ -1460,7 +1489,7 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
if (state.backtracking>0) {state.failed=true; return retval;}
|
if (state.backtracking>0) {state.failed=true; return retval;}
|
||||||
throw new FailedPredicateException(input, "terminal", "!inContext(\"TOKENS ASSIGN\")");
|
throw new FailedPredicateException(input, "terminal", "!inContext(\"TOKENS ASSIGN\")");
|
||||||
}
|
}
|
||||||
STRING_LITERAL17=(GrammarAST)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_terminal778); if (state.failed) return retval;
|
STRING_LITERAL17=(GrammarAST)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_terminal797); if (state.failed) return retval;
|
||||||
if ( state.backtracking==1 ) {
|
if ( state.backtracking==1 ) {
|
||||||
|
|
||||||
terminals.add(((GrammarAST)retval.start));
|
terminals.add(((GrammarAST)retval.start));
|
||||||
|
@ -1476,7 +1505,7 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
case 2 :
|
case 2 :
|
||||||
// CollectSymbols.g:266:7: TOKEN_REF
|
// CollectSymbols.g:266:7: TOKEN_REF
|
||||||
{
|
{
|
||||||
TOKEN_REF18=(GrammarAST)match(input,TOKEN_REF,FOLLOW_TOKEN_REF_in_terminal793); if (state.failed) return retval;
|
TOKEN_REF18=(GrammarAST)match(input,TOKEN_REF,FOLLOW_TOKEN_REF_in_terminal812); if (state.failed) return retval;
|
||||||
if ( state.backtracking==1 ) {
|
if ( state.backtracking==1 ) {
|
||||||
|
|
||||||
terminals.add(TOKEN_REF18);
|
terminals.add(TOKEN_REF18);
|
||||||
|
@ -1513,22 +1542,22 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
// CollectSymbols.g:278:7: ({...}?r= RULE_REF | r= RULE_REF )
|
// CollectSymbols.g:278:7: ({...}?r= RULE_REF | r= RULE_REF )
|
||||||
{
|
{
|
||||||
// CollectSymbols.g:278:7: ({...}?r= RULE_REF | r= RULE_REF )
|
// CollectSymbols.g:278:7: ({...}?r= RULE_REF | r= RULE_REF )
|
||||||
int alt14=2;
|
int alt15=2;
|
||||||
int LA14_0 = input.LA(1);
|
int LA15_0 = input.LA(1);
|
||||||
|
|
||||||
if ( (LA14_0==RULE_REF) ) {
|
if ( (LA15_0==RULE_REF) ) {
|
||||||
int LA14_1 = input.LA(2);
|
int LA15_1 = input.LA(2);
|
||||||
|
|
||||||
if ( ((inContext("DOT ..."))) ) {
|
if ( ((inContext("DOT ..."))) ) {
|
||||||
alt14=1;
|
alt15=1;
|
||||||
}
|
}
|
||||||
else if ( (true) ) {
|
else if ( (true) ) {
|
||||||
alt14=2;
|
alt15=2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (state.backtracking>0) {state.failed=true; return ;}
|
if (state.backtracking>0) {state.failed=true; return ;}
|
||||||
NoViableAltException nvae =
|
NoViableAltException nvae =
|
||||||
new NoViableAltException("", 14, 1, input);
|
new NoViableAltException("", 15, 1, input);
|
||||||
|
|
||||||
throw nvae;
|
throw nvae;
|
||||||
}
|
}
|
||||||
|
@ -1536,11 +1565,11 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
else {
|
else {
|
||||||
if (state.backtracking>0) {state.failed=true; return ;}
|
if (state.backtracking>0) {state.failed=true; return ;}
|
||||||
NoViableAltException nvae =
|
NoViableAltException nvae =
|
||||||
new NoViableAltException("", 14, 0, input);
|
new NoViableAltException("", 15, 0, input);
|
||||||
|
|
||||||
throw nvae;
|
throw nvae;
|
||||||
}
|
}
|
||||||
switch (alt14) {
|
switch (alt15) {
|
||||||
case 1 :
|
case 1 :
|
||||||
// CollectSymbols.g:278:9: {...}?r= RULE_REF
|
// CollectSymbols.g:278:9: {...}?r= RULE_REF
|
||||||
{
|
{
|
||||||
|
@ -1548,7 +1577,7 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
if (state.backtracking>0) {state.failed=true; return ;}
|
if (state.backtracking>0) {state.failed=true; return ;}
|
||||||
throw new FailedPredicateException(input, "ruleref", "inContext(\"DOT ...\")");
|
throw new FailedPredicateException(input, "ruleref", "inContext(\"DOT ...\")");
|
||||||
}
|
}
|
||||||
r=(GrammarAST)match(input,RULE_REF,FOLLOW_RULE_REF_in_ruleref830); if (state.failed) return ;
|
r=(GrammarAST)match(input,RULE_REF,FOLLOW_RULE_REF_in_ruleref849); if (state.failed) return ;
|
||||||
if ( state.backtracking==1 ) {
|
if ( state.backtracking==1 ) {
|
||||||
qualifiedRulerefs.add((GrammarAST)r.getParent());
|
qualifiedRulerefs.add((GrammarAST)r.getParent());
|
||||||
}
|
}
|
||||||
|
@ -1558,7 +1587,7 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
case 2 :
|
case 2 :
|
||||||
// CollectSymbols.g:280:8: r= RULE_REF
|
// CollectSymbols.g:280:8: r= RULE_REF
|
||||||
{
|
{
|
||||||
r=(GrammarAST)match(input,RULE_REF,FOLLOW_RULE_REF_in_ruleref843); if (state.failed) return ;
|
r=(GrammarAST)match(input,RULE_REF,FOLLOW_RULE_REF_in_ruleref862); if (state.failed) return ;
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1607,7 +1636,7 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
"\21\3\uffff\1\12\1\14\1\uffff\1\11\2\uffff\1\1\1\uffff\1\2\3\uffff"+
|
"\21\3\uffff\1\12\1\14\1\uffff\1\11\2\uffff\1\1\1\uffff\1\2\3\uffff"+
|
||||||
"\1\10";
|
"\1\10";
|
||||||
static final String DFA1_specialS =
|
static final String DFA1_specialS =
|
||||||
"\11\uffff\1\3\1\4\1\1\23\uffff\1\2\1\0\1\uffff}>";
|
"\11\uffff\1\2\1\4\1\3\23\uffff\1\0\1\1\1\uffff}>";
|
||||||
static final String[] DFA1_transitionS = {
|
static final String[] DFA1_transitionS = {
|
||||||
"\1\7\1\uffff\1\17\4\uffff\1\1\11\uffff\1\10\1\uffff\1\21\1\20"+
|
"\1\7\1\uffff\1\17\4\uffff\1\1\11\uffff\1\10\1\uffff\1\21\1\20"+
|
||||||
"\1\uffff\1\5\11\uffff\1\3\4\uffff\1\15\10\uffff\1\2\2\uffff"+
|
"\1\uffff\1\5\11\uffff\1\3\4\uffff\1\15\10\uffff\1\2\2\uffff"+
|
||||||
|
@ -1685,36 +1714,6 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
int _s = s;
|
int _s = s;
|
||||||
switch ( s ) {
|
switch ( s ) {
|
||||||
case 0 :
|
case 0 :
|
||||||
int LA1_32 = input.LA(1);
|
|
||||||
|
|
||||||
|
|
||||||
int index1_32 = input.index();
|
|
||||||
input.rewind();
|
|
||||||
s = -1;
|
|
||||||
if ( ((inContext("TOKENS"))) ) {s = 4;}
|
|
||||||
|
|
||||||
else if ( ((inContext("RULE ..."))) ) {s = 13;}
|
|
||||||
|
|
||||||
|
|
||||||
input.seek(index1_32);
|
|
||||||
if ( s>=0 ) return s;
|
|
||||||
break;
|
|
||||||
case 1 :
|
|
||||||
int LA1_11 = input.LA(1);
|
|
||||||
|
|
||||||
|
|
||||||
int index1_11 = input.index();
|
|
||||||
input.rewind();
|
|
||||||
s = -1;
|
|
||||||
if ( ((inContext("RESULT ..."))) ) {s = 12;}
|
|
||||||
|
|
||||||
else if ( (true) ) {s = 22;}
|
|
||||||
|
|
||||||
|
|
||||||
input.seek(index1_11);
|
|
||||||
if ( s>=0 ) return s;
|
|
||||||
break;
|
|
||||||
case 2 :
|
|
||||||
int LA1_31 = input.LA(1);
|
int LA1_31 = input.LA(1);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1729,7 +1728,22 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
input.seek(index1_31);
|
input.seek(index1_31);
|
||||||
if ( s>=0 ) return s;
|
if ( s>=0 ) return s;
|
||||||
break;
|
break;
|
||||||
case 3 :
|
case 1 :
|
||||||
|
int LA1_32 = input.LA(1);
|
||||||
|
|
||||||
|
|
||||||
|
int index1_32 = input.index();
|
||||||
|
input.rewind();
|
||||||
|
s = -1;
|
||||||
|
if ( ((inContext("TOKENS"))) ) {s = 4;}
|
||||||
|
|
||||||
|
else if ( ((inContext("RULE ..."))) ) {s = 13;}
|
||||||
|
|
||||||
|
|
||||||
|
input.seek(index1_32);
|
||||||
|
if ( s>=0 ) return s;
|
||||||
|
break;
|
||||||
|
case 2 :
|
||||||
int LA1_9 = input.LA(1);
|
int LA1_9 = input.LA(1);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1744,6 +1758,21 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
input.seek(index1_9);
|
input.seek(index1_9);
|
||||||
if ( s>=0 ) return s;
|
if ( s>=0 ) return s;
|
||||||
break;
|
break;
|
||||||
|
case 3 :
|
||||||
|
int LA1_11 = input.LA(1);
|
||||||
|
|
||||||
|
|
||||||
|
int index1_11 = input.index();
|
||||||
|
input.rewind();
|
||||||
|
s = -1;
|
||||||
|
if ( ((inContext("RESULT ..."))) ) {s = 12;}
|
||||||
|
|
||||||
|
else if ( (true) ) {s = 22;}
|
||||||
|
|
||||||
|
|
||||||
|
input.seek(index1_11);
|
||||||
|
if ( s>=0 ) return s;
|
||||||
|
break;
|
||||||
case 4 :
|
case 4 :
|
||||||
int LA1_10 = input.LA(1);
|
int LA1_10 = input.LA(1);
|
||||||
|
|
||||||
|
@ -1768,40 +1797,51 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static final String DFA5_eotS =
|
static final String DFA5_eotS =
|
||||||
"\26\uffff";
|
"\40\uffff";
|
||||||
static final String DFA5_eofS =
|
static final String DFA5_eofS =
|
||||||
"\26\uffff";
|
"\40\uffff";
|
||||||
static final String DFA5_minS =
|
static final String DFA5_minS =
|
||||||
"\1\4\2\2\1\uffff\2\4\2\2\1\uffff\1\3\3\2\3\4\2\2\2\3\1\uffff\1\3";
|
"\1\4\3\2\1\uffff\3\4\1\2\1\3\1\2\1\uffff\2\3\1\uffff\4\2\4\4\1\2"+
|
||||||
|
"\2\3\1\2\3\3\1\uffff\1\3";
|
||||||
static final String DFA5_maxS =
|
static final String DFA5_maxS =
|
||||||
"\3\146\1\uffff\4\146\1\uffff\13\146\1\uffff\1\146";
|
"\4\146\1\uffff\6\146\1\uffff\2\146\1\uffff\17\146\1\uffff\1\146";
|
||||||
static final String DFA5_acceptS =
|
static final String DFA5_acceptS =
|
||||||
"\3\uffff\1\1\4\uffff\1\2\13\uffff\1\2\1\uffff";
|
"\4\uffff\1\1\6\uffff\1\2\2\uffff\1\2\17\uffff\1\2\1\uffff";
|
||||||
static final String DFA5_specialS =
|
static final String DFA5_specialS =
|
||||||
"\26\uffff}>";
|
"\40\uffff}>";
|
||||||
static final String[] DFA5_transitionS = {
|
static final String[] DFA5_transitionS = {
|
||||||
"\107\3\1\1\1\3\1\2\31\3",
|
"\70\4\1\2\16\4\1\1\1\4\1\3\31\4",
|
||||||
"\1\4\1\uffff\143\3",
|
"\1\5\1\uffff\143\4",
|
||||||
"\1\5\1\uffff\143\3",
|
"\1\6\1\uffff\143\4",
|
||||||
|
"\1\7\1\uffff\143\4",
|
||||||
"",
|
"",
|
||||||
"\143\6",
|
"\143\10",
|
||||||
"\143\7",
|
"\123\4\1\11\17\4",
|
||||||
"\2\10\143\6",
|
"\143\12",
|
||||||
"\1\10\1\11\143\7",
|
"\2\13\143\10",
|
||||||
|
"\15\4\1\14\126\4",
|
||||||
|
"\1\13\1\15\143\12",
|
||||||
"",
|
"",
|
||||||
"\1\10\107\14\1\12\1\14\1\13\31\14",
|
"\1\16\143\4",
|
||||||
"\1\15\1\10\107\14\1\12\1\14\1\13\31\14",
|
"\1\16\70\22\1\20\16\22\1\17\1\22\1\21\31\22",
|
||||||
"\1\16\1\10\107\14\1\12\1\14\1\13\31\14",
|
|
||||||
"\1\17\1\10\107\14\1\12\1\14\1\13\31\14",
|
|
||||||
"\143\20",
|
|
||||||
"\143\21",
|
|
||||||
"\143\22",
|
|
||||||
"\1\3\1\23\143\20",
|
|
||||||
"\1\3\1\24\143\21",
|
|
||||||
"\1\25\143\22",
|
|
||||||
"\1\24\107\14\1\12\1\14\1\13\31\14",
|
|
||||||
"",
|
"",
|
||||||
"\1\24\107\14\1\12\1\14\1\13\31\14"
|
"\1\23\1\16\70\22\1\20\16\22\1\17\1\22\1\21\31\22",
|
||||||
|
"\1\24\1\16\70\22\1\20\16\22\1\17\1\22\1\21\31\22",
|
||||||
|
"\1\25\1\16\70\22\1\20\16\22\1\17\1\22\1\21\31\22",
|
||||||
|
"\1\26\1\16\70\22\1\20\16\22\1\17\1\22\1\21\31\22",
|
||||||
|
"\143\27",
|
||||||
|
"\123\31\1\30\17\31",
|
||||||
|
"\143\32",
|
||||||
|
"\143\31",
|
||||||
|
"\1\4\1\33\143\27",
|
||||||
|
"\1\35\14\31\1\34\126\31",
|
||||||
|
"\1\35\143\31",
|
||||||
|
"\1\4\1\36\143\32",
|
||||||
|
"\1\36\70\22\1\20\16\22\1\17\1\22\1\21\31\22",
|
||||||
|
"\1\37\143\31",
|
||||||
|
"\1\36\70\22\1\20\16\22\1\17\1\22\1\21\31\22",
|
||||||
|
"",
|
||||||
|
"\1\36\70\22\1\20\16\22\1\17\1\22\1\21\31\22"
|
||||||
};
|
};
|
||||||
|
|
||||||
static final short[] DFA5_eot = DFA.unpackEncodedString(DFA5_eotS);
|
static final short[] DFA5_eot = DFA.unpackEncodedString(DFA5_eotS);
|
||||||
|
@ -1873,33 +1913,36 @@ public class CollectSymbols extends org.antlr.v4.runtime.tree.TreeFilter {
|
||||||
public static final BitSet FOLLOW_RULE_in_rule382 = new BitSet(new long[]{0x0000000000000004L});
|
public static final BitSet FOLLOW_RULE_in_rule382 = new BitSet(new long[]{0x0000000000000004L});
|
||||||
public static final BitSet FOLLOW_ID_in_rule394 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000007FFFFFFFFFL});
|
public static final BitSet FOLLOW_ID_in_rule394 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000007FFFFFFFFFL});
|
||||||
public static final BitSet FOLLOW_RULEMODIFIERS_in_rule418 = new BitSet(new long[]{0x0000000000000004L});
|
public static final BitSet FOLLOW_RULEMODIFIERS_in_rule418 = new BitSet(new long[]{0x0000000000000004L});
|
||||||
public static final BitSet FOLLOW_BLOCK_in_rule441 = new BitSet(new long[]{0x0000000000000004L});
|
public static final BitSet FOLLOW_AT_in_rule442 = new BitSet(new long[]{0x0000000000000004L});
|
||||||
public static final BitSet FOLLOW_set_in_setAlt484 = new BitSet(new long[]{0x0000000000000002L});
|
public static final BitSet FOLLOW_ID_in_rule444 = new BitSet(new long[]{0x0000000000010000L});
|
||||||
public static final BitSet FOLLOW_RULE_in_finishRule508 = new BitSet(new long[]{0x0000000000000002L});
|
public static final BitSet FOLLOW_ACTION_in_rule446 = new BitSet(new long[]{0x0000000000000008L});
|
||||||
public static final BitSet FOLLOW_AT_in_ruleNamedAction524 = new BitSet(new long[]{0x0000000000000004L});
|
public static final BitSet FOLLOW_BLOCK_in_rule460 = new BitSet(new long[]{0x0000000000000004L});
|
||||||
public static final BitSet FOLLOW_ID_in_ruleNamedAction526 = new BitSet(new long[]{0x0000000000010000L});
|
public static final BitSet FOLLOW_set_in_setAlt503 = new BitSet(new long[]{0x0000000000000002L});
|
||||||
public static final BitSet FOLLOW_ACTION_in_ruleNamedAction528 = new BitSet(new long[]{0x0000000000000008L});
|
public static final BitSet FOLLOW_RULE_in_finishRule527 = new BitSet(new long[]{0x0000000000000002L});
|
||||||
public static final BitSet FOLLOW_ACTION_in_ruleAction548 = new BitSet(new long[]{0x0000000000000002L});
|
public static final BitSet FOLLOW_AT_in_ruleNamedAction543 = new BitSet(new long[]{0x0000000000000004L});
|
||||||
public static final BitSet FOLLOW_CATCH_in_exceptionHandler564 = new BitSet(new long[]{0x0000000000000004L});
|
public static final BitSet FOLLOW_ID_in_ruleNamedAction545 = new BitSet(new long[]{0x0000000000010000L});
|
||||||
public static final BitSet FOLLOW_ARG_ACTION_in_exceptionHandler566 = new BitSet(new long[]{0x0000000000010000L});
|
public static final BitSet FOLLOW_ACTION_in_ruleNamedAction547 = new BitSet(new long[]{0x0000000000000008L});
|
||||||
public static final BitSet FOLLOW_ACTION_in_exceptionHandler568 = new BitSet(new long[]{0x0000000000000008L});
|
public static final BitSet FOLLOW_ACTION_in_ruleAction567 = new BitSet(new long[]{0x0000000000000002L});
|
||||||
public static final BitSet FOLLOW_FINALLY_in_finallyClause585 = new BitSet(new long[]{0x0000000000000004L});
|
public static final BitSet FOLLOW_CATCH_in_exceptionHandler583 = new BitSet(new long[]{0x0000000000000004L});
|
||||||
public static final BitSet FOLLOW_ACTION_in_finallyClause587 = new BitSet(new long[]{0x0000000000000008L});
|
public static final BitSet FOLLOW_ARG_ACTION_in_exceptionHandler585 = new BitSet(new long[]{0x0000000000010000L});
|
||||||
public static final BitSet FOLLOW_ARG_ACTION_in_ruleArg607 = new BitSet(new long[]{0x0000000000000002L});
|
public static final BitSet FOLLOW_ACTION_in_exceptionHandler587 = new BitSet(new long[]{0x0000000000000008L});
|
||||||
public static final BitSet FOLLOW_RETURNS_in_ruleReturns624 = new BitSet(new long[]{0x0000000000000004L});
|
public static final BitSet FOLLOW_FINALLY_in_finallyClause604 = new BitSet(new long[]{0x0000000000000004L});
|
||||||
public static final BitSet FOLLOW_ARG_ACTION_in_ruleReturns626 = new BitSet(new long[]{0x0000000000000008L});
|
public static final BitSet FOLLOW_ACTION_in_finallyClause606 = new BitSet(new long[]{0x0000000000000008L});
|
||||||
public static final BitSet FOLLOW_SCOPE_in_ruleScopeSpec649 = new BitSet(new long[]{0x0000000000000004L});
|
public static final BitSet FOLLOW_ARG_ACTION_in_ruleArg626 = new BitSet(new long[]{0x0000000000000002L});
|
||||||
public static final BitSet FOLLOW_ACTION_in_ruleScopeSpec651 = new BitSet(new long[]{0x0000000000000008L});
|
public static final BitSet FOLLOW_RETURNS_in_ruleReturns643 = new BitSet(new long[]{0x0000000000000004L});
|
||||||
public static final BitSet FOLLOW_SCOPE_in_ruleScopeSpec664 = new BitSet(new long[]{0x0000000000000004L});
|
public static final BitSet FOLLOW_ARG_ACTION_in_ruleReturns645 = new BitSet(new long[]{0x0000000000000008L});
|
||||||
public static final BitSet FOLLOW_ID_in_ruleScopeSpec668 = new BitSet(new long[]{0x0000000000000008L,0x0000000000800000L});
|
public static final BitSet FOLLOW_SCOPE_in_ruleScopeSpec668 = new BitSet(new long[]{0x0000000000000004L});
|
||||||
public static final BitSet FOLLOW_set_in_rewriteElement696 = new BitSet(new long[]{0x0000000000000002L});
|
public static final BitSet FOLLOW_ACTION_in_ruleScopeSpec670 = new BitSet(new long[]{0x0000000000000008L});
|
||||||
public static final BitSet FOLLOW_ASSIGN_in_labeledElement732 = new BitSet(new long[]{0x0000000000000004L});
|
public static final BitSet FOLLOW_SCOPE_in_ruleScopeSpec683 = new BitSet(new long[]{0x0000000000000004L});
|
||||||
public static final BitSet FOLLOW_ID_in_labeledElement736 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000007FFFFFFFFFL});
|
public static final BitSet FOLLOW_ID_in_ruleScopeSpec687 = new BitSet(new long[]{0x0000000000000008L,0x0000000000800000L});
|
||||||
public static final BitSet FOLLOW_PLUS_ASSIGN_in_labeledElement748 = new BitSet(new long[]{0x0000000000000004L});
|
public static final BitSet FOLLOW_set_in_rewriteElement715 = new BitSet(new long[]{0x0000000000000002L});
|
||||||
public static final BitSet FOLLOW_ID_in_labeledElement752 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000007FFFFFFFFFL});
|
public static final BitSet FOLLOW_ASSIGN_in_labeledElement751 = new BitSet(new long[]{0x0000000000000004L});
|
||||||
public static final BitSet FOLLOW_STRING_LITERAL_in_terminal778 = new BitSet(new long[]{0x0000000000000002L});
|
public static final BitSet FOLLOW_ID_in_labeledElement755 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000007FFFFFFFFFL});
|
||||||
public static final BitSet FOLLOW_TOKEN_REF_in_terminal793 = new BitSet(new long[]{0x0000000000000002L});
|
public static final BitSet FOLLOW_PLUS_ASSIGN_in_labeledElement767 = new BitSet(new long[]{0x0000000000000004L});
|
||||||
public static final BitSet FOLLOW_RULE_REF_in_ruleref830 = new BitSet(new long[]{0x0000000000000002L});
|
public static final BitSet FOLLOW_ID_in_labeledElement771 = new BitSet(new long[]{0xFFFFFFFFFFFFFFF0L,0x0000007FFFFFFFFFL});
|
||||||
public static final BitSet FOLLOW_RULE_REF_in_ruleref843 = new BitSet(new long[]{0x0000000000000002L});
|
public static final BitSet FOLLOW_STRING_LITERAL_in_terminal797 = new BitSet(new long[]{0x0000000000000002L});
|
||||||
|
public static final BitSet FOLLOW_TOKEN_REF_in_terminal812 = new BitSet(new long[]{0x0000000000000002L});
|
||||||
|
public static final BitSet FOLLOW_RULE_REF_in_ruleref849 = new BitSet(new long[]{0x0000000000000002L});
|
||||||
|
public static final BitSet FOLLOW_RULE_REF_in_ruleref862 = new BitSet(new long[]{0x0000000000000002L});
|
||||||
|
|
||||||
}
|
}
|
|
@ -84,13 +84,24 @@ public class SemanticPipeline {
|
||||||
AttributeChecks.checkAllAttributeExpressions(g);
|
AttributeChecks.checkAllAttributeExpressions(g);
|
||||||
|
|
||||||
// ASSIGN TOKEN TYPES
|
// ASSIGN TOKEN TYPES
|
||||||
assignTokenTypes(g, collector, symcheck);
|
if ( g.isLexer() ) assignLexerTokenTypes(g, collector);
|
||||||
|
else assignTokenTypes(g, collector, symcheck);
|
||||||
|
|
||||||
UseDefAnalyzer usedef = new UseDefAnalyzer();
|
UseDefAnalyzer usedef = new UseDefAnalyzer();
|
||||||
usedef.checkRewriteElementsPresentOnLeftSide(g, collector.rules);
|
usedef.checkRewriteElementsPresentOnLeftSide(g, collector.rules);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void assignTokenTypes(Grammar g, CollectSymbols collector, SymbolChecks symcheck) {
|
void assignLexerTokenTypes(Grammar g, CollectSymbols collector) {
|
||||||
|
Grammar G = g.getOutermostGrammar(); // put in root, even if imported
|
||||||
|
for (GrammarAST def : collector.tokensDefs) {
|
||||||
|
if ( def.getType()== ANTLRParser.ID ) G.defineTokenName(def.getText());
|
||||||
|
}
|
||||||
|
for (Rule r : g.rules.values()) {
|
||||||
|
if ( !r.isFragment() ) G.defineTokenName(r.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void assignTokenTypes(Grammar g, CollectSymbols collector, SymbolChecks symcheck) {
|
||||||
if ( g.implicitLexerOwner!=null ) {
|
if ( g.implicitLexerOwner!=null ) {
|
||||||
// copy vocab from combined to implicit lexer
|
// copy vocab from combined to implicit lexer
|
||||||
g.importVocab(g.implicitLexerOwner);
|
g.importVocab(g.implicitLexerOwner);
|
||||||
|
|
|
@ -30,6 +30,7 @@ public class Grammar implements AttributeResolver {
|
||||||
new HashMap<String, AttributeDict>() {{
|
new HashMap<String, AttributeDict>() {{
|
||||||
put("lexer:RULE_LABEL", Rule.predefinedLexerRulePropertiesDict);
|
put("lexer:RULE_LABEL", Rule.predefinedLexerRulePropertiesDict);
|
||||||
put("lexer:LEXER_STRING_LABEL", Rule.predefinedLexerRulePropertiesDict);
|
put("lexer:LEXER_STRING_LABEL", Rule.predefinedLexerRulePropertiesDict);
|
||||||
|
put("lexer:TOKEN_LABEL", AttributeDict.predefinedTokenDict);
|
||||||
put("parser:RULE_LABEL", Rule.predefinedRulePropertiesDict);
|
put("parser:RULE_LABEL", Rule.predefinedRulePropertiesDict);
|
||||||
put("parser:TOKEN_LABEL", AttributeDict.predefinedTokenDict);
|
put("parser:TOKEN_LABEL", AttributeDict.predefinedTokenDict);
|
||||||
put("tree:RULE_LABEL", Rule.predefinedTreeRulePropertiesDict);
|
put("tree:RULE_LABEL", Rule.predefinedTreeRulePropertiesDict);
|
||||||
|
|
Loading…
Reference in New Issue