all rule indexes are 0-based now; 0..n-1 not 1..n

[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 8667]
This commit is contained in:
parrt 2011-06-18 15:06:49 -08:00
parent 1530234c29
commit da633613a7
7 changed files with 134 additions and 139 deletions

View File

@ -44,8 +44,6 @@ public class ATN {
public ATN(Grammar g) {
this.g = g;
if ( g.isLexer() ) {
ruleToTokenType.add(0); // no rule index 0
ruleToActionIndex.add(0); // no action index 0
for (Rule r : g.rules.values()) {
ruleToTokenType.add(g.getTokenType(r.name));
if ( r.actionIndex>0 ) ruleToActionIndex.add(r.actionIndex);

View File

@ -42,8 +42,6 @@ public abstract class ATNInterpreter {
int s = toInt(data[p++]);
ATNState startState = atn.states.get(s);
atn.rules.add(startState);
if ( atn.ruleToTokenType.size()==0 ) atn.ruleToTokenType.add(0); // we're indexed from 1
if ( atn.ruleToActionIndex.size()==0 ) atn.ruleToActionIndex.add(0); // we're indexed from 1
if ( atn.grammarType==ANTLRParser.LEXER ) {
int tokenType = toInt(data[p++]);
atn.ruleToTokenType.add(tokenType);
@ -106,7 +104,7 @@ public abstract class ATNInterpreter {
switch (type) {
case Transition.EPSILON : return new EpsilonTransition(target);
case Transition.RANGE : return new RangeTransition(arg1, arg2, target);
case Transition.RULE : return new RuleTransition(arg1, atn.states.get(arg1), target);
case Transition.RULE : return new RuleTransition(arg2, atn.states.get(arg1), target);
case Transition.PREDICATE : return new PredicateTransition(target, arg1, arg2);
case Transition.ATOM : return new AtomTransition(arg1, target);
case Transition.ACTION : return new ActionTransition(target, arg1, arg2);

View File

@ -56,12 +56,12 @@ public class ATNSerializer {
}
int nrules = atn.rules.size();
data.add(nrules);
for (int r=1; r<=nrules; r++) {
ATNState ruleStartState = atn.rules.get(r-1);
for (int r=0; r<nrules; r++) {
ATNState ruleStartState = atn.rules.get(r);
data.add(ruleStartState.stateNumber);
if ( atn.g.isLexer() ) {
data.add(atn.ruleToTokenType.get(r));
String ruleName = atn.g.rules.getKey(r-1);
String ruleName = atn.g.rules.getKey(r);
Rule rule = atn.g.getRule(ruleName);
data.add(rule.actionIndex);
}

View File

@ -190,9 +190,8 @@ public class ParserATNFactory implements ATNFactory {
}
/** Build what amounts to an epsilon transition with an action.
* The action goes into ATN though it is ignored during analysis.
* It slows things down a bit, but I must ignore predicates after
* having seen an action (5-5-2008).
* The action goes into ATN though it is ignored during prediction
* if actionIndex < 0. Only forced are executed during prediction.
*/
public Handle action(ActionAST action) {
//System.out.println("action: "+action);

View File

@ -53,7 +53,7 @@ public class Grammar implements AttributeResolver {
* not include lexical rules if combined.
*/
public OrderedHashMap<String, Rule> rules = new OrderedHashMap<String, Rule>();
int ruleNumber = 1;
int ruleNumber = 0; // used to get rule indexes (0..n-1)
/** The ATN that represents the grammar with edges labelled with tokens
* or epsilon. It is more suitable to analysis than an AST representation.

View File

@ -77,7 +77,7 @@ public class Rule implements AttributeResolver {
public Alternative[] alt;
/** All rules have unique index 1..n */
/** All rules have unique index 0..n-1 */
public int index;
public int actionIndex; // if lexer

View File

@ -12,13 +12,13 @@ public class TestATNSerialization extends BaseTest {
"a : A B ;");
String expecting =
"max type 4\n" +
"0:RULE_START 1\n" +
"1:RULE_STOP 1\n" +
"2:BASIC 1\n" +
"3:BASIC 1\n" +
"4:BASIC 1\n" +
"5:BASIC 1\n" +
"6:BASIC 1\n" +
"0:RULE_START 0\n" +
"1:RULE_STOP 0\n" +
"2:BASIC 0\n" +
"3:BASIC 0\n" +
"4:BASIC 0\n" +
"5:BASIC 0\n" +
"6:BASIC 0\n" +
"rule 1:0 0,0\n" +
"0->2 EPSILON 0,0\n" +
"1->6 ATOM -1,0\n" +
@ -38,11 +38,11 @@ public class TestATNSerialization extends BaseTest {
"a : ~A ;");
String expecting =
"max type 5\n" +
"0:RULE_START 1\n" +
"1:RULE_STOP 1\n" +
"2:BASIC 1\n" +
"3:BASIC 1\n" +
"4:BASIC 1\n" +
"0:RULE_START 0\n" +
"1:RULE_STOP 0\n" +
"2:BASIC 0\n" +
"3:BASIC 0\n" +
"4:BASIC 0\n" +
"rule 1:0 0,0\n" +
"0->2 EPSILON 0,0\n" +
"1->4 ATOM -1,0\n" +
@ -60,11 +60,11 @@ public class TestATNSerialization extends BaseTest {
"a : . ;");
String expecting =
"max type 5\n" +
"0:RULE_START 1\n" +
"1:RULE_STOP 1\n" +
"2:BASIC 1\n" +
"3:BASIC 1\n" +
"4:BASIC 1\n" +
"0:RULE_START 0\n" +
"1:RULE_STOP 0\n" +
"2:BASIC 0\n" +
"3:BASIC 0\n" +
"4:BASIC 0\n" +
"rule 1:0 0,0\n" +
"0->2 EPSILON 0,0\n" +
"1->4 ATOM -1,0\n" +
@ -81,17 +81,17 @@ public class TestATNSerialization extends BaseTest {
"a : A | A B ;");
String expecting =
"max type 4\n" +
"0:RULE_START 1\n" +
"1:RULE_STOP 1\n" +
"2:BASIC 1\n" +
"3:BASIC 1\n" +
"4:BASIC 1\n" +
"5:BASIC 1\n" +
"6:BASIC 1\n" +
"7:BASIC 1\n" +
"8:BLOCK_START 1\n" +
"9:BLOCK_END 1\n" +
"10:BASIC 1\n" +
"0:RULE_START 0\n" +
"1:RULE_STOP 0\n" +
"2:BASIC 0\n" +
"3:BASIC 0\n" +
"4:BASIC 0\n" +
"5:BASIC 0\n" +
"6:BASIC 0\n" +
"7:BASIC 0\n" +
"8:BLOCK_START 0\n" +
"9:BLOCK_END 0\n" +
"10:BASIC 0\n" +
"rule 1:0 0,0\n" +
"0->8 EPSILON 0,0\n" +
"1->10 ATOM -1,0\n" +
@ -116,23 +116,23 @@ public class TestATNSerialization extends BaseTest {
"a : A | A B | A B C ;");
String expecting =
"max type 5\n" +
"0:RULE_START 1\n" +
"1:RULE_STOP 1\n" +
"2:BASIC 1\n" +
"3:BASIC 1\n" +
"4:BASIC 1\n" +
"5:BASIC 1\n" +
"6:BASIC 1\n" +
"7:BASIC 1\n" +
"8:BASIC 1\n" +
"9:BASIC 1\n" +
"10:BASIC 1\n" +
"11:BASIC 1\n" +
"12:BASIC 1\n" +
"13:BASIC 1\n" +
"14:BLOCK_START 1\n" +
"15:BLOCK_END 1\n" +
"16:BASIC 1\n" +
"0:RULE_START 0\n" +
"1:RULE_STOP 0\n" +
"2:BASIC 0\n" +
"3:BASIC 0\n" +
"4:BASIC 0\n" +
"5:BASIC 0\n" +
"6:BASIC 0\n" +
"7:BASIC 0\n" +
"8:BASIC 0\n" +
"9:BASIC 0\n" +
"10:BASIC 0\n" +
"11:BASIC 0\n" +
"12:BASIC 0\n" +
"13:BASIC 0\n" +
"14:BLOCK_START 0\n" +
"15:BLOCK_END 0\n" +
"16:BASIC 0\n" +
"rule 1:0 0,0\n" +
"0->14 EPSILON 0,0\n" +
"1->16 ATOM -1,0\n" +
@ -164,17 +164,17 @@ public class TestATNSerialization extends BaseTest {
"a : A+ B ;");
String expecting =
"max type 4\n" +
"0:RULE_START 1\n" +
"1:RULE_STOP 1\n" +
"2:BASIC 1\n" +
"3:BASIC 1\n" +
"4:PLUS_BLOCK_START 1\n" +
"5:BLOCK_END 1\n" +
"6:PLUS_LOOP_BACK 1\n" +
"7:BASIC 1\n" +
"8:BASIC 1\n" +
"9:BASIC 1\n" +
"10:BASIC 1\n" +
"0:RULE_START 0\n" +
"1:RULE_STOP 0\n" +
"2:BASIC 0\n" +
"3:BASIC 0\n" +
"4:PLUS_BLOCK_START 0\n" +
"5:BLOCK_END 0\n" +
"6:PLUS_LOOP_BACK 0\n" +
"7:BASIC 0\n" +
"8:BASIC 0\n" +
"9:BASIC 0\n" +
"10:BASIC 0\n" +
"rule 1:0 0,0\n" +
"0->4 EPSILON 0,0\n" +
"1->10 ATOM -1,0\n" +
@ -202,22 +202,22 @@ public class TestATNSerialization extends BaseTest {
"e : E ;\n");
String expecting =
"max type 3\n" +
"0:RULE_START 1\n" +
"1:RULE_STOP 1\n" +
"2:RULE_START 2\n" +
"3:RULE_STOP 2\n" +
"4:BASIC 1\n" +
"5:BASIC 1\n" +
"6:BASIC 2\n" +
"7:BASIC 2\n" +
"8:BASIC 2\n" +
"0:RULE_START 0\n" +
"1:RULE_STOP 0\n" +
"2:RULE_START 1\n" +
"3:RULE_STOP 1\n" +
"4:BASIC 0\n" +
"5:BASIC 0\n" +
"6:BASIC 1\n" +
"7:BASIC 1\n" +
"8:BASIC 1\n" +
"rule 1:0 0,0\n" +
"rule 2:2 0,0\n" +
"0->4 EPSILON 0,0\n" +
"1->8 ATOM -1,0\n" +
"2->6 EPSILON 0,0\n" +
"3->5 EPSILON 0,0\n" +
"4->5 RULE 2,2\n" +
"4->5 RULE 2,1\n" +
"5->1 EPSILON 0,0\n" +
"6->7 ATOM 3,0\n" +
"7->3 EPSILON 0,0\n";
@ -234,14 +234,14 @@ public class TestATNSerialization extends BaseTest {
String expecting =
"max type 4\n" +
"0:TOKEN_START 0\n" +
"1:RULE_START 1\n" +
"2:RULE_STOP 1\n" +
"3:RULE_START 2\n" +
"4:RULE_STOP 2\n" +
"5:BASIC 1\n" +
"6:BASIC 1\n" +
"7:BASIC 2\n" +
"8:BASIC 2\n" +
"1:RULE_START 0\n" +
"2:RULE_STOP 0\n" +
"3:RULE_START 1\n" +
"4:RULE_STOP 1\n" +
"5:BASIC 0\n" +
"6:BASIC 0\n" +
"7:BASIC 1\n" +
"8:BASIC 1\n" +
"rule 1:1 3,0\n" +
"rule 2:3 4,0\n" +
"mode 0:0\n" +
@ -266,10 +266,10 @@ public class TestATNSerialization extends BaseTest {
String expecting =
"max type 3\n" +
"0:TOKEN_START 0\n" +
"1:RULE_START 1\n" +
"2:RULE_STOP 1\n" +
"3:BASIC 1\n" +
"4:BASIC 1\n" +
"1:RULE_START 0\n" +
"2:RULE_STOP 0\n" +
"3:BASIC 0\n" +
"4:BASIC 0\n" +
"rule 1:1 3,0\n" +
"mode 0:0\n" +
"0->1 EPSILON 0,0\n" +
@ -289,14 +289,14 @@ public class TestATNSerialization extends BaseTest {
String expecting =
"max type 3\n" +
"0:TOKEN_START 0\n" +
"1:RULE_START 1\n" +
"2:RULE_STOP 1\n" +
"3:BASIC 1\n" +
"4:BASIC 1\n" +
"5:PLUS_BLOCK_START 1\n" +
"6:BLOCK_END 1\n" +
"7:PLUS_LOOP_BACK 1\n" +
"8:BASIC 1\n" +
"1:RULE_START 0\n" +
"2:RULE_STOP 0\n" +
"3:BASIC 0\n" +
"4:BASIC 0\n" +
"5:PLUS_BLOCK_START 0\n" +
"6:BLOCK_END 0\n" +
"7:PLUS_LOOP_BACK 0\n" +
"8:BASIC 0\n" +
"rule 1:1 3,0\n" +
"mode 0:0\n" +
"0->1 EPSILON 0,0\n" +
@ -326,20 +326,20 @@ public class TestATNSerialization extends BaseTest {
String expecting =
"max type 5\n" +
"0:TOKEN_START 0\n" +
"1:RULE_START 1\n" +
"2:RULE_STOP 1\n" +
"3:RULE_START 2\n" +
"4:RULE_STOP 2\n" +
"5:RULE_START 3\n" +
"6:RULE_STOP 3\n" +
"7:BASIC 1\n" +
"8:BASIC 1\n" +
"9:BASIC 1\n" +
"10:BASIC 2\n" +
"11:BASIC 2\n" +
"12:BASIC 3\n" +
"13:BASIC 3\n" +
"14:BASIC 3\n" +
"1:RULE_START 0\n" +
"2:RULE_STOP 0\n" +
"3:RULE_START 1\n" +
"4:RULE_STOP 1\n" +
"5:RULE_START 2\n" +
"6:RULE_STOP 2\n" +
"7:BASIC 0\n" +
"8:BASIC 0\n" +
"9:BASIC 0\n" +
"10:BASIC 1\n" +
"11:BASIC 1\n" +
"12:BASIC 2\n" +
"13:BASIC 2\n" +
"14:BASIC 2\n" +
"rule 1:1 3,1\n" +
"rule 2:3 4,0\n" +
"rule 3:5 5,2\n" +
@ -371,10 +371,10 @@ public class TestATNSerialization extends BaseTest {
String expecting =
"max type 3\n" +
"0:TOKEN_START 0\n" +
"1:RULE_START 1\n" +
"2:RULE_STOP 1\n" +
"3:BASIC 1\n" +
"4:BASIC 1\n" +
"1:RULE_START 0\n" +
"2:RULE_STOP 0\n" +
"3:BASIC 0\n" +
"4:BASIC 0\n" +
"rule 1:1 3,0\n" +
"mode 0:0\n" +
"0:'a'..'b'\n" +
@ -395,10 +395,10 @@ public class TestATNSerialization extends BaseTest {
String expecting =
"max type 3\n" +
"0:TOKEN_START 0\n" +
"1:RULE_START 1\n" +
"2:RULE_STOP 1\n" +
"3:BASIC 1\n" +
"4:BASIC 1\n" +
"1:RULE_START 0\n" +
"2:RULE_STOP 0\n" +
"3:BASIC 0\n" +
"4:BASIC 0\n" +
"rule 1:1 3,0\n" +
"mode 0:0\n" +
"0:'a'..'b', 'e'..'e', 'p'..'t'\n" +
@ -419,12 +419,12 @@ public class TestATNSerialization extends BaseTest {
String expecting =
"max type 3\n" +
"0:TOKEN_START 0\n" +
"1:RULE_START 1\n" +
"2:RULE_STOP 1\n" +
"3:BASIC 1\n" +
"4:BASIC 1\n" +
"5:BASIC 1\n" +
"6:BASIC 1\n" +
"1:RULE_START 0\n" +
"2:RULE_STOP 0\n" +
"3:BASIC 0\n" +
"4:BASIC 0\n" +
"5:BASIC 0\n" +
"6:BASIC 0\n" +
"rule 1:1 3,0\n" +
"mode 0:0\n" +
"0:'a'..'b'\n" +
@ -454,18 +454,18 @@ public class TestATNSerialization extends BaseTest {
"0:TOKEN_START 0\n" +
"1:TOKEN_START 0\n" +
"2:TOKEN_START 0\n" +
"3:RULE_START 1\n" +
"4:RULE_STOP 1\n" +
"5:RULE_START 2\n" +
"6:RULE_STOP 2\n" +
"7:RULE_START 3\n" +
"8:RULE_STOP 3\n" +
"9:BASIC 1\n" +
"10:BASIC 1\n" +
"11:BASIC 2\n" +
"12:BASIC 2\n" +
"13:BASIC 3\n" +
"14:BASIC 3\n" +
"3:RULE_START 0\n" +
"4:RULE_STOP 0\n" +
"5:RULE_START 1\n" +
"6:RULE_STOP 1\n" +
"7:RULE_START 2\n" +
"8:RULE_STOP 2\n" +
"9:BASIC 0\n" +
"10:BASIC 0\n" +
"11:BASIC 1\n" +
"12:BASIC 1\n" +
"13:BASIC 2\n" +
"14:BASIC 2\n" +
"rule 1:3 3,0\n" +
"rule 2:5 4,0\n" +
"rule 3:7 5,0\n" +