public static final boolean TRACE = false;
private static final int INITIAL_CAPACITY = 16;
- private static final int STATE_COUNT = 344;
- private static final int TERMINAL_COUNT = 82;
+ private static final int STATE_COUNT = 349;
+ private static final int TERMINAL_COUNT = 83;
private static final int NONTERMINAL_COUNT = 51;
- private static final int PRODUCT_COUNT = 132;
+ private static final int PRODUCT_COUNT = 133;
private static final int[] ACTION_ROW_ID = new int[STATE_COUNT];
private static final int[] ACTION_COLUMN_ID = new int[TERMINAL_COUNT];
- private static final short[] ACTION_TABLE = new short[6120];
- private static final int[] ERROR_TABLE = new int[882];
+ private static final short[] ACTION_TABLE = new short[6396];
+ private static final int[] ERROR_TABLE = new int[906];
private static final int[] GOTO_ROW_ID = new int[STATE_COUNT];
private static final int[] GOTO_COLUMN_ID = new int[NONTERMINAL_COUNT];
- private static final short[] GOTO_TABLE = new short[1829];
+ private static final short[] GOTO_TABLE = new short[1652];
private static final int[] PRODUCT_LHS = new int[PRODUCT_COUNT];
private static final short STATE_MASK = (short)0x0fff;
"SEMICOLON",
"LBRACE",
"RBRACE",
+ "MODULE",
"COMMA",
"HASTYPE",
"DATA",
"command",
"statement",
"declarations",
+ "field",
"var",
"bexp",
"rhs",
"stringLiteral",
"symbolWithoutMinus",
"listQualifier",
- "field",
"chrQuery",
"verboseChrQuery",
"caseRhs",
protected abstract RuntimeException syntaxError(Token token, String description);
- private static String describeAction(int action) {
+ private static String describeAction(boolean isGoto, int action) {
if(action == ERROR_ACTION)
return "ERROR";
if(action == ACCEPT_ACTION)
return "ACCEPT";
StringBuilder b = new StringBuilder();
- if((action & REDUCE_MASK) != 0) {
- action ^= REDUCE_MASK;
- b.append("REDUCE");
+ if(isGoto)
+ b.append("GOTO ");
+ else {
+ if((action & REDUCE_MASK) != 0) {
+ action ^= REDUCE_MASK;
+ b.append("REDUCE");
+ }
+ else
+ b.append("SHIFT");
}
- else
- b.append("SHIFT");
if((action & POP_MASK) != 0) {
action ^= POP_MASK;
b.append(" POP");
return b.toString();
}
+ private void printState(int state) {
+ System.out.print("state=" + state + ":");
+ for(int i=symbolStackLength-1,j=stateStackLength-1;i>=0;--i) {
+ Object s = symbolStack[i];
+ if(s instanceof Token)
+ System.out.print(" " + TERMINAL_NAMES[((Token)s).id]);
+ else if(s == null)
+ System.out.print(" null");
+ else
+ System.out.print(" " + s.getClass().getSimpleName());
+ while(j>=0 && symbolStackPositionStack[j]==i)
+ System.out.print(" (" + stateStack[j--] + ")");
+ }
+ System.out.println();
+ }
+
private Object parse(int state) {
while(true) {
Token token = nextToken();
int tokenId = token.id;
+ if(TRACE)
+ System.out.println("---> token " + TERMINAL_NAMES[tokenId] + " \"" + token.text + "\" <---");
while(true) {
+ if(TRACE)
+ printState(state);
short action = getAction(state, tokenId);
- if(TRACE) {
- System.out.println("state=" + state + ", tokenId=" + TERMINAL_NAMES[tokenId] +
- ", action=" + describeAction(action));
- System.out.print(" ");
- for(int i=symbolStackLength-1,j=stateStackLength-1;i>=0;--i) {
- Object s = symbolStack[i];
- if(s instanceof Token)
- System.out.print(" " + TERMINAL_NAMES[((Token)s).id]);
- else
- System.out.print(" " + s.getClass().getSimpleName());
- while(j>=0 && symbolStackPositionStack[j]==i)
- System.out.print(" (" + stateStack[j--] + ")");
- }
- System.out.println();
- }
+ if(TRACE)
+ System.out.println(" -> action=" + describeAction(false, action));
//System.out.println(STATE_DESCRIPTIONS[state]);
if((action & REDUCE_MASK) != 0) {
if(action == ACCEPT_ACTION)
return symbolStack[symbolStackLength-1];
if(action == ERROR_ACTION)
throw syntaxError(token, parseErrorDescription(state, token, tokenId));
- stateStackLength -= (action >>> 13)&3;
+ int popAmount = (action >>> 13)&3;
+ if(TRACE) {
+ if(popAmount > 0)
+ System.out.println(" POP " + popAmount);
+ }
+ stateStackLength -= popAmount;
action &= STATE_MASK;
int reductionBegin = symbolStackPositionStack[--stateStackLength];
symbolStack[symbolStackLength] = symbol;
state = stateStack[stateStackLength];
+ if(TRACE) {
+ ++symbolStackLength;
+ printState(state);
+ --symbolStackLength;
+ System.out.println(" nonterminal=" + NONTERMINAL_NAMES[PRODUCT_LHS[action]]);
+ }
action = getGoto(state, PRODUCT_LHS[action]);
+ if(TRACE)
+ System.out.println(" -> action=" + describeAction(true, action));
+
// Pop state
if((action & POP_MASK) != 0) {
--stateStackLength;
return parse(0);
}
public Object parseCommands() {
- return parse(329);
+ return parse(334);
}
public Object parseImport() {
- return parse(336);
+ return parse(341);
}
public Object parseType() {
- return parse(338);
+ return parse(343);
}
public Object parseExp() {
- return parse(340);
+ return parse(345);
}
public Object parseEquationBlock() {
- return parse(342);
+ return parse(347);
}
case 7:
return reduceEquationBlock();
case 8:
- return reduceTypeAnnotation();
+ return reduceModuleHeader();
case 9:
- return reduceValueDefinition();
+ return reduceTypeAnnotation();
case 10:
- return reduceDataDefinition();
+ return reduceValueDefinition();
case 11:
- return reduceTypeDefinition();
+ return reduceDataDefinition();
case 12:
- return reduceClassDefinition();
+ return reduceTypeDefinition();
case 13:
- return reduceInstanceDefinition();
+ return reduceClassDefinition();
case 14:
- return reduceDerivingInstanceDefinition();
+ return reduceInstanceDefinition();
case 15:
- return reduceDocumentationString();
+ return reduceDerivingInstanceDefinition();
case 16:
- return reduceAnnotation();
+ return reduceDocumentationString();
case 17:
- return reducePrecedenceDefinition();
+ return reduceAnnotation();
case 18:
- return reduceJustImport();
+ return reducePrecedenceDefinition();
case 19:
- return reduceImportJava();
+ return reduceJustImport();
case 20:
- return reduceEffectDefinition();
+ return reduceImportJava();
case 21:
- return reduceRuleDefinition();
+ return reduceEffectDefinition();
case 22:
- return reduceMappingRelationDefinition();
+ return reduceRuleDefinition();
case 23:
- return reduceRelationDefinition();
+ return reduceMappingRelationDefinition();
case 24:
- return reduceStatementCommand();
+ return reduceRelationDefinition();
case 25:
- return reduceImportCommand();
+ return reduceStatementCommand();
case 26:
- return reduceGuardStatement();
+ return reduceImportCommand();
case 27:
- return reduceLetStatement();
+ return reduceGuardStatement();
case 28:
- return reduceBindStatement();
+ return reduceLetStatement();
case 29:
- return reduceRuleStatement();
+ return reduceBindStatement();
case 30:
- return reduceCHRStatement();
+ return reduceRuleStatement();
case 31:
- return reduceVerboseCHRStatement();
+ return reduceCHRStatement();
case 32:
- return reduceConstraintStatement();
+ return reduceVerboseCHRStatement();
case 33:
- return reduceDeclarations();
+ return reduceConstraintStatement();
case 34:
- return reduceVarId();
+ return reduceDeclarations();
case 35:
- return reduceEscapedSymbol();
+ return reduceField();
case 36:
- return reduceTupleConstructor();
+ return reduceFieldShorthand();
case 37:
- return reduceBinary();
+ return reduceVarId();
case 38:
- return reduceSimpleRhs();
+ return reduceEscapedSymbol();
case 39:
- return reduceGuardedRhs();
+ return reduceTupleConstructor();
case 40:
- return reduceConstructor();
+ return reduceBinary();
case 41:
- return reduceRecordConstructor();
+ return reduceSimpleRhs();
case 42:
- return reduceContext();
+ return reduceGuardedRhs();
case 43:
- return reduceFundeps();
+ return reduceConstructor();
case 44:
- return reduceTypeVar();
+ return reduceRecordConstructor();
case 45:
- return reduceTupleType();
+ return reduceContext();
case 46:
- return reduceListType();
+ return reduceFundeps();
case 47:
- return reduceListTypeConstructor();
+ return reduceTypeVar();
case 48:
- return reduceTupleTypeConstructor();
+ return reduceTupleType();
case 49:
- return reduceLambda();
+ return reduceListType();
case 50:
- return reduceLambdaMatch();
+ return reduceListTypeConstructor();
case 51:
- return reduceLet();
+ return reduceTupleTypeConstructor();
case 52:
- return reduceIf();
+ return reduceLambda();
case 53:
- return reduceMatch();
+ return reduceLambdaMatch();
case 54:
- return reduceDo();
+ return reduceLet();
case 55:
- return reduceSelect();
+ return reduceIf();
case 56:
- return reduceEnforce();
+ return reduceMatch();
case 57:
- return reduceVar();
+ return reduceDo();
case 58:
- return reduceHashedId();
+ return reduceSelect();
case 59:
- return reduceBlank();
+ return reduceEnforce();
case 60:
- return reduceInteger();
+ return reduceVar();
case 61:
- return reduceFloat();
+ return reduceHashedId();
case 62:
- return reduceString();
+ return reduceBlank();
case 63:
- return reduceChar();
+ return reduceInteger();
case 64:
- return reduceTuple();
+ return reduceFloat();
case 65:
- return reduceViewPattern();
+ return reduceString();
case 66:
- return reduceRightSection();
+ return reduceChar();
case 67:
- return reduceLeftSection();
+ return reduceTuple();
case 68:
- return reduceListLiteral();
+ return reduceViewPattern();
case 69:
- return reduceRange();
+ return reduceRightSection();
case 70:
- return reduceListComprehension();
+ return reduceLeftSection();
case 71:
- return reduceAs();
+ return reduceListLiteral();
case 72:
- return reduceRecord();
+ return reduceRange();
case 73:
- return reduceTransformation();
+ return reduceListComprehension();
case 74:
- return reduceEq();
+ return reduceAs();
case 75:
- return reduceRuleDeclarations();
+ return reduceRecord();
case 76:
- return reduceImportShowing();
+ return reduceTransformation();
case 77:
- return reduceImportHiding();
+ return reduceEq();
case 78:
- return reduceImportValueItem();
+ return reduceRuleDeclarations();
case 79:
- return reduceFieldDescription();
+ return reduceImportShowing();
case 80:
- return reduceStatements();
+ return reduceImportHiding();
case 81:
- return reduceGuardedExpEq();
+ return reduceImportValueItem();
case 82:
- return reduceFundep();
+ return reduceFieldDescription();
case 83:
- return reduceQueryRuleDeclaration();
+ return reduceStatements();
case 84:
- return reduceAnnotation();
+ return reduceGuardedExpEq();
case 85:
- return reduceGuardQuery();
+ return reduceFundep();
case 86:
- return reduceEqualsQuery();
+ return reduceQueryRuleDeclaration();
case 87:
- return reduceBindQuery();
+ return reduceAnnotation();
case 88:
- return reduceCompositeQuery();
+ return reduceGuardQuery();
case 89:
- return reduceQueryBlock();
+ return reduceEqualsQuery();
case 90:
- return reduceApply();
+ return reduceBindQuery();
case 91:
- return reduceSymbol();
+ return reduceCompositeQuery();
case 92:
- return reduceEscapedId();
+ return reduceQueryBlock();
case 93:
- return reduceMinus();
+ return reduceApply();
case 94:
- return reduceLess();
+ return reduceSymbol();
case 95:
- return reduceGreater();
+ return reduceEscapedId();
case 96:
- return reduceDot();
+ return reduceMinus();
case 97:
- return reduceFieldAccess();
+ return reduceLess();
case 98:
- return reduceIdAccessor();
+ return reduceGreater();
case 99:
- return reduceStringAccessor();
+ return reduceDot();
case 100:
- return reduceExpAccessor();
+ return reduceFieldAccess();
case 101:
- return reduceCase();
+ return reduceIdAccessor();
case 102:
- return reduceStringLiteral();
+ return reduceStringAccessor();
case 103:
- return reduceSymbol();
+ return reduceExpAccessor();
case 104:
- return reduceEscapedId();
+ return reduceCase();
case 105:
- return reduceLess();
+ return reduceStringLiteral();
case 106:
- return reduceGreater();
+ return reduceSymbol();
case 107:
- return reduceDot();
+ return reduceEscapedId();
case 108:
- return reduceGuardQualifier();
+ return reduceLess();
case 109:
- return reduceLetQualifier();
+ return reduceGreater();
case 110:
- return reduceBindQualifier();
+ return reduceDot();
case 111:
- return reduceThenQualifier();
+ return reduceGuardQualifier();
case 112:
- return reduceField();
+ return reduceLetQualifier();
case 113:
- return reduceFieldShorthand();
+ return reduceBindQualifier();
case 114:
- return reduceCHRQuery();
+ return reduceThenQualifier();
case 115:
- return reduceVerboseCHRQuery();
+ return reduceCHRQuery();
case 116:
- return reduceSimpleCaseRhs();
+ return reduceVerboseCHRQuery();
case 117:
- return reduceGuardedCaseRhs();
+ return reduceSimpleCaseRhs();
case 118:
- return reduceGuardedExpArrow();
+ return reduceGuardedCaseRhs();
case 119:
- return reduceGuardEquation();
+ return reduceGuardedExpArrow();
case 120:
- return reduceBasicEquation();
+ return reduceGuardEquation();
case 121:
- return reduceEffect();
+ return reduceBasicEquation();
case 122:
- return reduceJustEtype();
+ return reduceEffect();
case 123:
- return reduceForAll();
+ return reduceJustEtype();
case 124:
- return reduceApplyType();
+ return reduceForAll();
case 125:
- return reduceDummy1();
+ return reduceApplyType();
+ case 126:
+ return reduceDummy();
default:
throw new RuntimeException("Internal parser error.");
* equationBlock ::= (equation (SEMICOLON equation)*)?
*/
protected abstract Object reduceEquationBlock();
+ /**
+ * declaration ::= MODULE LBRACE (field (COMMA field)*)? RBRACE
+ */
+ protected abstract Object reduceModuleHeader();
/**
* declaration ::= (var COMMA)* var HASTYPE type
*/
* declarations ::= LBRACE (declaration (SEMICOLON (declaration SEMICOLON)* declaration)?)? RBRACE
*/
protected abstract Object reduceDeclarations();
+ /**
+ * field ::= ID EQUALS exp
+ */
+ protected abstract Object reduceField();
+ /**
+ * field ::= ID
+ */
+ protected abstract Object reduceFieldShorthand();
/**
* var ::= ID
*/
* listQualifier ::= THEN exp (BY exp)?
*/
protected abstract Object reduceThenQualifier();
- /**
- * field ::= ID EQUALS exp
- */
- protected abstract Object reduceField();
- /**
- * field ::= ID
- */
- protected abstract Object reduceFieldShorthand();
/**
* chrQuery ::= (listQualifier COMMA)* listQualifier
*/
/**
* dummy ::= COMMENT EOL
*/
- protected abstract Object reduceDummy1();
+ protected abstract Object reduceDummy();
protected void postReduce(Object reduced) {
}