]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLParser.java
Added module header feature to SCL language.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / parsing / parser / SCLParser.java
index 532f6e8a3f62941644a6c57a501e7a13fa08381e..362bc51420da61eccbac64be9e5165a84bf88cf9 100644 (file)
@@ -13,18 +13,18 @@ public abstract class SCLParser {
     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;
@@ -38,6 +38,7 @@ public abstract class SCLParser {
         "SEMICOLON",
         "LBRACE",
         "RBRACE",
+        "MODULE",
         "COMMA",
         "HASTYPE",
         "DATA",
@@ -130,6 +131,7 @@ public abstract class SCLParser {
         "command",
         "statement",
         "declarations",
+        "field",
         "var",
         "bexp",
         "rhs",
@@ -156,7 +158,6 @@ public abstract class SCLParser {
         "stringLiteral",
         "symbolWithoutMinus",
         "listQualifier",
-        "field",
         "chrQuery",
         "verboseChrQuery",
         "caseRhs",
@@ -252,18 +253,22 @@ public abstract class SCLParser {
     
     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");
@@ -276,34 +281,46 @@ public abstract class SCLParser {
         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];
@@ -318,7 +335,16 @@ public abstract class SCLParser {
                     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;
@@ -367,19 +393,19 @@ public abstract class SCLParser {
         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);
     }
 
 
@@ -403,241 +429,243 @@ public abstract class SCLParser {
         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.");
@@ -689,6 +717,10 @@ public abstract class SCLParser {
      * equationBlock ::= (equation (SEMICOLON equation)&#42;)?
      */
     protected abstract Object reduceEquationBlock();
+    /**
+     * declaration ::= MODULE LBRACE (field (COMMA field)&#42;)? RBRACE
+     */
+    protected abstract Object reduceModuleHeader();
     /**
      * declaration ::= (var COMMA)&#42; var HASTYPE type
      */
@@ -793,6 +825,14 @@ public abstract class SCLParser {
      * declarations ::= LBRACE (declaration (SEMICOLON (declaration SEMICOLON)&#42; declaration)?)? RBRACE
      */
     protected abstract Object reduceDeclarations();
+    /**
+     * field ::= ID EQUALS exp
+     */
+    protected abstract Object reduceField();
+    /**
+     * field ::= ID
+     */
+    protected abstract Object reduceFieldShorthand();
     /**
      * var ::= ID
      */
@@ -1081,14 +1121,6 @@ public abstract class SCLParser {
      * 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)&#42; listQualifier
      */
@@ -1136,7 +1168,7 @@ public abstract class SCLParser {
     /**
      * dummy ::= COMMENT EOL
      */
-    protected abstract Object reduceDummy1();
+    protected abstract Object reduceDummy();
 
     protected void postReduce(Object reduced) {
     }