]> gerrit.simantics Code Review - simantics/sysdyn.git/commitdiff
better support for arrays and for loops
authorlempinen <lempinen@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Mon, 20 Dec 2010 16:00:55 +0000 (16:00 +0000)
committerlempinen <lempinen@ac1ea38d-2e2b-0410-8846-a27921b304fc>
Mon, 20 Dec 2010 16:00:55 +0000 (16:00 +0000)
git-svn-id: https://www.simantics.org/svn/simantics/sysdyn/trunk@19173 ac1ea38d-2e2b-0410-8846-a27921b304fc

org.simantics.sysdyn/src/org/simantics/sysdyn/expressionParser/ExpressionParser.java
org.simantics.sysdyn/src/org/simantics/sysdyn/expressionParser/ExpressionParser.jj

index 4eba9ba17de493d4d2550ccfd35807e0e4c9b0b7..083230fd24645106d198369ff58b9f2716d2fdaa 100644 (file)
@@ -10,6 +10,8 @@ import java.util.HashMap;
 \r
 public class ExpressionParser implements ExpressionParserConstants {\r
 \r
+    boolean forIndex = false;\r
+\r
         HashMap<String, List<Token>> references = new HashMap<String, List<Token>>();\r
 \r
     public HashMap<String, List<Token>> getReferences() {\r
@@ -22,6 +24,20 @@ public class ExpressionParser implements ExpressionParserConstants {
         return ranges;\r
     }\r
 \r
+        List<Token> currentRange = null;\r
+\r
+        HashMap<Token, List<Token>> forIndices = new HashMap<Token, List<Token>>();\r
+\r
+    public HashMap<Token, List<Token>> getForIndices() {\r
+        return forIndices;\r
+    }\r
+\r
+    HashMap<String, List<Token>> enumerationReferences = new HashMap<String, List<Token>>();\r
+\r
+    public HashMap<String, List<Token>> getEnumerationReferences() {\r
+        return enumerationReferences;\r
+    }\r
+\r
 /*** Parser ********************************************************/\r
 \r
 // https://javacc.dev.java.net/doc/javaccgrm.html\r
@@ -385,7 +401,7 @@ public class ExpressionParser implements ExpressionParserConstants {
       } else {\r
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
         case IDENT:\r
-          component_reference();\r
+          component_reference(null);\r
           break;\r
         case 62:\r
           jj_consume_token(62);\r
@@ -440,14 +456,28 @@ public class ExpressionParser implements ExpressionParserConstants {
     }\r
   }\r
 \r
-  final public void component_reference() throws ParseException {\r
+  final public void component_reference(Token prevToken) throws ParseException {\r
     jj_consume_token(IDENT);\r
         String name = token.image;\r
-        if(references.get(name) == null) {\r
-                references.put(name, new ArrayList<Token>());\r
+\r
+        // prevToken != null => this is the second part of an enumeration\r
+        if(forIndex == true && prevToken != null) {\r
+                if(enumerationReferences.get(prevToken.image) == null) {\r
+                        enumerationReferences.put(prevToken.image, new ArrayList<Token>());\r
+                }\r
+                List<Token> list = enumerationReferences.get(prevToken.image);\r
+                list.add(token);\r
+\r
+        // prevToken == null => this is a normal variable\r
+        } else {\r
+                if(references.get(name) == null) {\r
+                        references.put(name, new ArrayList<Token>());\r
+                }\r
+                List<Token> list = references.get(name);\r
+                list.add(token);\r
         }\r
-        List<Token> list = references.get(name);\r
-        list.add(token);\r
+\r
+        Token curToken = token;\r
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
     case 66:\r
       array_subscripts();\r
@@ -459,7 +489,7 @@ public class ExpressionParser implements ExpressionParserConstants {
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
     case 68:\r
       jj_consume_token(68);\r
-      component_reference();\r
+      component_reference(curToken);\r
       break;\r
     default:\r
       jj_la1[23] = jj_gen;\r
@@ -499,12 +529,25 @@ public class ExpressionParser implements ExpressionParserConstants {
     if (jj_2_2(2)) {\r
       expression();\r
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
+      case 21:\r
       case 71:\r
-        jj_consume_token(71);\r
-        function_arguments();\r
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
+        case 71:\r
+          jj_consume_token(71);\r
+          function_arguments();\r
+          break;\r
+        case 21:\r
+          jj_consume_token(21);\r
+          for_indices();\r
+          break;\r
+        default:\r
+          jj_la1[25] = jj_gen;\r
+          jj_consume_token(-1);\r
+          throw new ParseException();\r
+        }\r
         break;\r
       default:\r
-        jj_la1[25] = jj_gen;\r
+        jj_la1[26] = jj_gen;\r
         ;\r
       }\r
     } else {\r
@@ -513,13 +556,46 @@ public class ExpressionParser implements ExpressionParserConstants {
         named_arguments();\r
         break;\r
       default:\r
-        jj_la1[26] = jj_gen;\r
+        jj_la1[27] = jj_gen;\r
         jj_consume_token(-1);\r
         throw new ParseException();\r
       }\r
     }\r
   }\r
 \r
+  final public void for_indices() throws ParseException {\r
+    for_index();\r
+    label_8:\r
+    while (true) {\r
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
+      case 71:\r
+        ;\r
+        break;\r
+      default:\r
+        jj_la1[28] = jj_gen;\r
+        break label_8;\r
+      }\r
+      jj_consume_token(71);\r
+      for_index();\r
+    }\r
+  }\r
+\r
+  final public void for_index() throws ParseException {\r
+    jj_consume_token(IDENT);\r
+                forIndices.put(token, currentRange);\r
+                forIndex = true;\r
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
+    case 41:\r
+      jj_consume_token(41);\r
+      expression();\r
+      break;\r
+    default:\r
+      jj_la1[29] = jj_gen;\r
+      ;\r
+    }\r
+                forIndex = false;\r
+  }\r
+\r
   final public void named_arguments() throws ParseException {\r
     named_argument();\r
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
@@ -528,7 +604,7 @@ public class ExpressionParser implements ExpressionParserConstants {
       named_arguments();\r
       break;\r
     default:\r
-      jj_la1[27] = jj_gen;\r
+      jj_la1[30] = jj_gen;\r
       ;\r
     }\r
   }\r
@@ -560,18 +636,18 @@ public class ExpressionParser implements ExpressionParserConstants {
       expression();\r
       break;\r
     default:\r
-      jj_la1[28] = jj_gen;\r
+      jj_la1[31] = jj_gen;\r
       ;\r
     }\r
-    label_8:\r
+    label_9:\r
     while (true) {\r
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
       case 71:\r
         ;\r
         break;\r
       default:\r
-        jj_la1[29] = jj_gen;\r
-        break label_8;\r
+        jj_la1[32] = jj_gen;\r
+        break label_9;\r
       }\r
       jj_consume_token(71);\r
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
@@ -594,7 +670,7 @@ public class ExpressionParser implements ExpressionParserConstants {
         expression();\r
         break;\r
       default:\r
-        jj_la1[30] = jj_gen;\r
+        jj_la1[33] = jj_gen;\r
         ;\r
       }\r
     }\r
@@ -602,15 +678,15 @@ public class ExpressionParser implements ExpressionParserConstants {
 \r
   final public void expression_list() throws ParseException {\r
     expression();\r
-    label_9:\r
+    label_10:\r
     while (true) {\r
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
       case 71:\r
         ;\r
         break;\r
       default:\r
-        jj_la1[31] = jj_gen;\r
-        break label_9;\r
+        jj_la1[34] = jj_gen;\r
+        break label_10;\r
       }\r
       jj_consume_token(71);\r
       expression();\r
@@ -622,18 +698,18 @@ public class ExpressionParser implements ExpressionParserConstants {
                 ranges.put(token.image, new ArrayList<List<Token>>());\r
         }\r
         List<List<Token>> rangesList = ranges.get(token.image);\r
-        List<Token> currentRange = new ArrayList<Token>();\r
+        currentRange = new ArrayList<Token>();\r
     jj_consume_token(66);\r
     subscript(currentRange);\r
-    label_10:\r
+    label_11:\r
     while (true) {\r
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {\r
       case 71:\r
         ;\r
         break;\r
       default:\r
-        jj_la1[32] = jj_gen;\r
-        break label_10;\r
+        jj_la1[35] = jj_gen;\r
+        break label_11;\r
       }\r
       jj_consume_token(71);\r
       subscript(currentRange);\r
@@ -660,7 +736,7 @@ public class ExpressionParser implements ExpressionParserConstants {
         rangeIndex(rangeToken, true);\r
         break;\r
       default:\r
-        jj_la1[33] = jj_gen;\r
+        jj_la1[36] = jj_gen;\r
         ;\r
       }\r
             rangeToken.endColumn = token.endColumn;\r
@@ -668,7 +744,7 @@ public class ExpressionParser implements ExpressionParserConstants {
                 currentRange.add(rangeToken);\r
       break;\r
     default:\r
-      jj_la1[34] = jj_gen;\r
+      jj_la1[37] = jj_gen;\r
       jj_consume_token(-1);\r
       throw new ParseException();\r
     }\r
@@ -687,7 +763,7 @@ public class ExpressionParser implements ExpressionParserConstants {
                 rangeToken.image = rangeToken.image + token.image;\r
       break;\r
     default:\r
-      jj_la1[35] = jj_gen;\r
+      jj_la1[38] = jj_gen;\r
       jj_consume_token(-1);\r
       throw new ParseException();\r
     }\r
@@ -707,82 +783,62 @@ public class ExpressionParser implements ExpressionParserConstants {
     finally { jj_save(1, xla); }\r
   }\r
 \r
-  private boolean jj_3R_14() {\r
-    if (jj_scan_token(68)) return true;\r
-    if (jj_3R_11()) return true;\r
-    return false;\r
-  }\r
-\r
-  private boolean jj_3R_44() {\r
-    if (jj_scan_token(IDENT)) return true;\r
-    Token xsp;\r
-    xsp = jj_scanpos;\r
-    if (jj_3R_48()) jj_scanpos = xsp;\r
-    xsp = jj_scanpos;\r
-    if (jj_3R_49()) jj_scanpos = xsp;\r
-    return false;\r
-  }\r
-\r
-  private boolean jj_3R_11() {\r
-    if (jj_scan_token(IDENT)) return true;\r
-    Token xsp;\r
-    xsp = jj_scanpos;\r
-    if (jj_3R_14()) jj_scanpos = xsp;\r
-    return false;\r
-  }\r
-\r
-  private boolean jj_3_1() {\r
-    if (jj_3R_11()) return true;\r
-    if (jj_scan_token(62)) return true;\r
-    return false;\r
-  }\r
-\r
-  private boolean jj_3R_42() {\r
+  private boolean jj_3R_45() {\r
     if (jj_scan_token(87)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_41() {\r
+  private boolean jj_3R_44() {\r
     if (jj_scan_token(64)) return true;\r
-    if (jj_3R_47()) return true;\r
+    if (jj_3R_50()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_40() {\r
+  private boolean jj_3R_43() {\r
     if (jj_scan_token(66)) return true;\r
-    if (jj_3R_46()) return true;\r
+    if (jj_3R_49()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_37() {\r
-    if (jj_3R_11()) return true;\r
-    if (jj_3R_43()) return true;\r
+  private boolean jj_3R_40() {\r
+    if (jj_3R_12()) return true;\r
+    if (jj_3R_46()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_39() {\r
+  private boolean jj_3R_42() {\r
     if (jj_scan_token(62)) return true;\r
-    if (jj_3R_45()) return true;\r
+    if (jj_3R_48()) return true;\r
     if (jj_scan_token(63)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_35() {\r
+  private boolean jj_3R_38() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
     if (jj_scan_token(86)) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_42()) return true;\r
+    if (jj_3R_45()) return true;\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_38() {\r
-    if (jj_3R_44()) return true;\r
+  private boolean jj_3R_41() {\r
+    if (jj_3R_47()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_34() {\r
+  private boolean jj_3R_53() {\r
+    if (jj_3R_13()) return true;\r
+    return false;\r
+  }\r
+\r
+  private boolean jj_3R_49() {\r
+    if (jj_3R_13()) return true;\r
+    return false;\r
+  }\r
+\r
+  private boolean jj_3R_37() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
     if (jj_scan_token(93)) {\r
@@ -795,15 +851,15 @@ public class ExpressionParser implements ExpressionParserConstants {
     jj_scanpos = xsp;\r
     if (jj_scan_token(33)) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_37()) {\r
+    if (jj_3R_40()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_38()) {\r
+    if (jj_3R_41()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_39()) {\r
+    if (jj_3R_42()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_40()) {\r
+    if (jj_3R_43()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_41()) {\r
+    if (jj_3R_44()) {\r
     jj_scanpos = xsp;\r
     if (jj_scan_token(35)) return true;\r
     }\r
@@ -819,22 +875,38 @@ public class ExpressionParser implements ExpressionParserConstants {
     return false;\r
   }\r
 \r
-  private boolean jj_3R_33() {\r
-    if (jj_3R_36()) return true;\r
+  private boolean jj_3R_48() {\r
+    Token xsp;\r
+    xsp = jj_scanpos;\r
+    if (jj_3R_53()) jj_scanpos = xsp;\r
+    while (true) {\r
+      xsp = jj_scanpos;\r
+      if (jj_3R_54()) { jj_scanpos = xsp; break; }\r
+    }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_26() {\r
-    if (jj_3R_30()) return true;\r
+  private boolean jj_3R_58() {\r
+    if (jj_scan_token(IDENT)) return true;\r
+    return false;\r
+  }\r
+\r
+  private boolean jj_3R_36() {\r
+    if (jj_3R_39()) return true;\r
     return false;\r
   }\r
 \r
   private boolean jj_3R_29() {\r
-    if (jj_3R_31()) return true;\r
+    if (jj_3R_33()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_36() {\r
+  private boolean jj_3R_32() {\r
+    if (jj_3R_34()) return true;\r
+    return false;\r
+  }\r
+\r
+  private boolean jj_3R_39() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
     if (jj_scan_token(82)) {\r
@@ -850,40 +922,45 @@ public class ExpressionParser implements ExpressionParserConstants {
     return false;\r
   }\r
 \r
-  private boolean jj_3R_32() {\r
-    if (jj_3R_34()) return true;\r
-    Token xsp;\r
-    xsp = jj_scanpos;\r
-    if (jj_3R_35()) jj_scanpos = xsp;\r
-    return false;\r
-  }\r
-\r
-  private boolean jj_3R_51() {\r
+  private boolean jj_3R_18() {\r
     if (jj_scan_token(71)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_28() {\r
-    if (jj_3R_32()) return true;\r
+  private boolean jj_3R_14() {\r
     Token xsp;\r
-    while (true) {\r
-      xsp = jj_scanpos;\r
-      if (jj_3R_33()) { jj_scanpos = xsp; break; }\r
+    xsp = jj_scanpos;\r
+    if (jj_3R_18()) {\r
+    jj_scanpos = xsp;\r
+    if (jj_3R_19()) return true;\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_53() {\r
-    if (jj_scan_token(66)) return true;\r
+  private boolean jj_3R_35() {\r
+    if (jj_3R_37()) return true;\r
+    Token xsp;\r
+    xsp = jj_scanpos;\r
+    if (jj_3R_38()) jj_scanpos = xsp;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_13() {\r
-    if (jj_scan_token(71)) return true;\r
+  private boolean jj_3R_57() {\r
+    if (jj_3R_58()) return true;\r
     return false;\r
   }\r
 \r
   private boolean jj_3R_31() {\r
+    if (jj_3R_35()) return true;\r
+    Token xsp;\r
+    while (true) {\r
+      xsp = jj_scanpos;\r
+      if (jj_3R_36()) { jj_scanpos = xsp; break; }\r
+    }\r
+    return false;\r
+  }\r
+\r
+  private boolean jj_3R_34() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
     if (jj_scan_token(78)) {\r
@@ -899,29 +976,34 @@ public class ExpressionParser implements ExpressionParserConstants {
     return false;\r
   }\r
 \r
-  private boolean jj_3R_23() {\r
+  private boolean jj_3R_52() {\r
+    if (jj_scan_token(68)) return true;\r
+    return false;\r
+  }\r
+\r
+  private boolean jj_3R_26() {\r
     if (jj_scan_token(9)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_27() {\r
-    if (jj_3R_31()) return true;\r
+  private boolean jj_3R_30() {\r
+    if (jj_3R_34()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_25() {\r
+  private boolean jj_3R_28() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_27()) jj_scanpos = xsp;\r
-    if (jj_3R_28()) return true;\r
+    if (jj_3R_30()) jj_scanpos = xsp;\r
+    if (jj_3R_31()) return true;\r
     while (true) {\r
       xsp = jj_scanpos;\r
-      if (jj_3R_29()) { jj_scanpos = xsp; break; }\r
+      if (jj_3R_32()) { jj_scanpos = xsp; break; }\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_30() {\r
+  private boolean jj_3R_33() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
     if (jj_scan_token(72)) {\r
@@ -943,147 +1025,156 @@ public class ExpressionParser implements ExpressionParserConstants {
     return false;\r
   }\r
 \r
-  private boolean jj_3R_19() {\r
+  private boolean jj_3R_22() {\r
     if (jj_scan_token(69)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_21() {\r
+  private boolean jj_3R_24() {\r
     if (jj_scan_token(22)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_50() {\r
-    if (jj_3R_12()) return true;\r
-    return false;\r
-  }\r
-\r
-  private boolean jj_3R_46() {\r
-    if (jj_3R_12()) return true;\r
+  private boolean jj_3R_55() {\r
+    if (jj_3R_57()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_24() {\r
-    if (jj_3R_25()) return true;\r
+  private boolean jj_3R_27() {\r
+    if (jj_3R_28()) return true;\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_26()) jj_scanpos = xsp;\r
+    if (jj_3R_29()) jj_scanpos = xsp;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_45() {\r
+  private boolean jj_3R_50() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_50()) jj_scanpos = xsp;\r
-    while (true) {\r
-      xsp = jj_scanpos;\r
-      if (jj_3R_51()) { jj_scanpos = xsp; break; }\r
+    if (jj_3_2()) {\r
+    jj_scanpos = xsp;\r
+    if (jj_3R_55()) return true;\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_49() {\r
-    if (jj_scan_token(68)) return true;\r
+  private boolean jj_3_2() {\r
+    if (jj_3R_13()) return true;\r
+    Token xsp;\r
+    xsp = jj_scanpos;\r
+    if (jj_3R_14()) jj_scanpos = xsp;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_22() {\r
+  private boolean jj_3R_25() {\r
     Token xsp;\r
     xsp = jj_scanpos;\r
     if (jj_scan_token(12)) jj_scanpos = xsp;\r
-    if (jj_3R_24()) return true;\r
+    if (jj_3R_27()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_55() {\r
-    if (jj_scan_token(IDENT)) return true;\r
+  private boolean jj_3R_46() {\r
+    if (jj_scan_token(62)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_20() {\r
-    if (jj_3R_22()) return true;\r
+  private boolean jj_3R_23() {\r
+    if (jj_3R_25()) return true;\r
     Token xsp;\r
     while (true) {\r
       xsp = jj_scanpos;\r
-      if (jj_3R_23()) { jj_scanpos = xsp; break; }\r
+      if (jj_3R_26()) { jj_scanpos = xsp; break; }\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_54() {\r
-    if (jj_3R_55()) return true;\r
-    return false;\r
-  }\r
-\r
-  private boolean jj_3R_52() {\r
-    if (jj_3R_54()) return true;\r
+  private boolean jj_3R_51() {\r
+    if (jj_3R_56()) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_18() {\r
-    if (jj_3R_20()) return true;\r
+  private boolean jj_3R_21() {\r
+    if (jj_3R_23()) return true;\r
     Token xsp;\r
     while (true) {\r
       xsp = jj_scanpos;\r
-      if (jj_3R_21()) { jj_scanpos = xsp; break; }\r
+      if (jj_3R_24()) { jj_scanpos = xsp; break; }\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_47() {\r
+  private boolean jj_3R_20() {\r
+    if (jj_3R_21()) return true;\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3_2()) {\r
+    if (jj_3R_22()) jj_scanpos = xsp;\r
+    return false;\r
+  }\r
+\r
+  private boolean jj_3R_17() {\r
+    if (jj_scan_token(31)) return true;\r
+    if (jj_3R_13()) return true;\r
+    return false;\r
+  }\r
+\r
+  private boolean jj_3R_13() {\r
+    Token xsp;\r
+    xsp = jj_scanpos;\r
+    if (jj_3R_16()) {\r
     jj_scanpos = xsp;\r
-    if (jj_3R_52()) return true;\r
+    if (jj_3R_17()) return true;\r
     }\r
     return false;\r
   }\r
 \r
-  private boolean jj_3_2() {\r
+  private boolean jj_3R_16() {\r
+    if (jj_3R_20()) return true;\r
+    return false;\r
+  }\r
+\r
+  private boolean jj_3R_15() {\r
+    if (jj_scan_token(68)) return true;\r
     if (jj_3R_12()) return true;\r
-    Token xsp;\r
-    xsp = jj_scanpos;\r
-    if (jj_3R_13()) jj_scanpos = xsp;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_17() {\r
-    if (jj_3R_18()) return true;\r
+  private boolean jj_3R_47() {\r
+    if (jj_scan_token(IDENT)) return true;\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_19()) jj_scanpos = xsp;\r
+    if (jj_3R_51()) jj_scanpos = xsp;\r
+    xsp = jj_scanpos;\r
+    if (jj_3R_52()) jj_scanpos = xsp;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_16() {\r
-    if (jj_scan_token(31)) return true;\r
-    if (jj_3R_12()) return true;\r
+  private boolean jj_3R_54() {\r
+    if (jj_scan_token(71)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_43() {\r
-    if (jj_scan_token(62)) return true;\r
+  private boolean jj_3R_19() {\r
+    if (jj_scan_token(21)) return true;\r
     return false;\r
   }\r
 \r
   private boolean jj_3R_12() {\r
+    if (jj_scan_token(IDENT)) return true;\r
     Token xsp;\r
     xsp = jj_scanpos;\r
-    if (jj_3R_15()) {\r
-    jj_scanpos = xsp;\r
-    if (jj_3R_16()) return true;\r
-    }\r
+    if (jj_3R_15()) jj_scanpos = xsp;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_15() {\r
-    if (jj_3R_17()) return true;\r
+  private boolean jj_3R_56() {\r
+    if (jj_scan_token(66)) return true;\r
     return false;\r
   }\r
 \r
-  private boolean jj_3R_48() {\r
-    if (jj_3R_53()) return true;\r
+  private boolean jj_3_1() {\r
+    if (jj_3R_12()) return true;\r
+    if (jj_scan_token(62)) return true;\r
     return false;\r
   }\r
 \r
@@ -1098,7 +1189,7 @@ public class ExpressionParser implements ExpressionParserConstants {
   private Token jj_scanpos, jj_lastpos;\r
   private int jj_la;\r
   private int jj_gen;\r
-  final private int[] jj_la1 = new int[36];\r
+  final private int[] jj_la1 = new int[39];\r
   static private int[] jj_la1_0;\r
   static private int[] jj_la1_1;\r
   static private int[] jj_la1_2;\r
@@ -1108,13 +1199,13 @@ public class ExpressionParser implements ExpressionParserConstants {
       jj_la1_init_2();\r
    }\r
    private static void jj_la1_init_0() {\r
-      jj_la1_0 = new int[] {0x100000,0x80001040,0x100000,0x80001040,0x0,0x0,0x400000,0x200,0x1000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x80001040,0x0,0x0,0x0,0x80001040,0x0,0x80001040,0x0,0x0,0x0,0x0,0x0,};\r
+      jj_la1_0 = new int[] {0x100000,0x80001040,0x100000,0x80001040,0x0,0x0,0x400000,0x200,0x1000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x80001040,0x200000,0x200000,0x0,0x0,0x0,0x0,0x80001040,0x0,0x80001040,0x0,0x0,0x0,0x0,0x0,};\r
    }\r
    private static void jj_la1_init_1() {\r
-      jj_la1_1 = new int[] {0x0,0x4000000a,0x0,0x4000000a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x40000008,0x0,0x0,0x0,0x4000000a,0x0,0x0,0x0,0x4000000a,0x0,0x4000000a,0x0,0x0,0x0,0x0,0x0,};\r
+      jj_la1_1 = new int[] {0x0,0x4000000a,0x0,0x4000000a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x40000008,0x0,0x0,0x0,0x4000000a,0x0,0x0,0x0,0x0,0x200,0x0,0x4000000a,0x0,0x4000000a,0x0,0x0,0x0,0x0,0x0,};\r
    }\r
    private static void jj_la1_init_2() {\r
-      jj_la1_2 = new int[] {0x0,0x3c03c005,0x0,0x3c03c005,0x20,0x20,0x0,0x0,0x0,0x3f00,0x3f00,0x3c000,0x3c000,0x3c000,0x3c0000,0xc00000,0xc00000,0x3c0000,0x40,0x38000000,0x4000005,0x10,0x4,0x10,0x3c03c005,0x80,0x4000000,0x80,0x3c03c005,0x80,0x3c03c005,0x80,0x80,0x20,0x14000020,0x14000000,};\r
+      jj_la1_2 = new int[] {0x0,0x3c03c005,0x0,0x3c03c005,0x20,0x20,0x0,0x0,0x0,0x3f00,0x3f00,0x3c000,0x3c000,0x3c000,0x3c0000,0xc00000,0xc00000,0x3c0000,0x40,0x38000000,0x4000005,0x10,0x4,0x10,0x3c03c005,0x80,0x80,0x4000000,0x80,0x0,0x80,0x3c03c005,0x80,0x3c03c005,0x80,0x80,0x20,0x14000020,0x14000000,};\r
    }\r
   final private JJCalls[] jj_2_rtns = new JJCalls[2];\r
   private boolean jj_rescan = false;\r
@@ -1131,7 +1222,7 @@ public class ExpressionParser implements ExpressionParserConstants {
     token = new Token();\r
     jj_ntk = -1;\r
     jj_gen = 0;\r
-    for (int i = 0; i < 36; i++) jj_la1[i] = -1;\r
+    for (int i = 0; i < 39; i++) jj_la1[i] = -1;\r
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();\r
   }\r
 \r
@@ -1146,7 +1237,7 @@ public class ExpressionParser implements ExpressionParserConstants {
     token = new Token();\r
     jj_ntk = -1;\r
     jj_gen = 0;\r
-    for (int i = 0; i < 36; i++) jj_la1[i] = -1;\r
+    for (int i = 0; i < 39; i++) jj_la1[i] = -1;\r
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();\r
   }\r
 \r
@@ -1157,7 +1248,7 @@ public class ExpressionParser implements ExpressionParserConstants {
     token = new Token();\r
     jj_ntk = -1;\r
     jj_gen = 0;\r
-    for (int i = 0; i < 36; i++) jj_la1[i] = -1;\r
+    for (int i = 0; i < 39; i++) jj_la1[i] = -1;\r
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();\r
   }\r
 \r
@@ -1168,7 +1259,7 @@ public class ExpressionParser implements ExpressionParserConstants {
     token = new Token();\r
     jj_ntk = -1;\r
     jj_gen = 0;\r
-    for (int i = 0; i < 36; i++) jj_la1[i] = -1;\r
+    for (int i = 0; i < 39; i++) jj_la1[i] = -1;\r
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();\r
   }\r
 \r
@@ -1178,7 +1269,7 @@ public class ExpressionParser implements ExpressionParserConstants {
     token = new Token();\r
     jj_ntk = -1;\r
     jj_gen = 0;\r
-    for (int i = 0; i < 36; i++) jj_la1[i] = -1;\r
+    for (int i = 0; i < 39; i++) jj_la1[i] = -1;\r
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();\r
   }\r
 \r
@@ -1188,7 +1279,7 @@ public class ExpressionParser implements ExpressionParserConstants {
     token = new Token();\r
     jj_ntk = -1;\r
     jj_gen = 0;\r
-    for (int i = 0; i < 36; i++) jj_la1[i] = -1;\r
+    for (int i = 0; i < 39; i++) jj_la1[i] = -1;\r
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();\r
   }\r
 \r
@@ -1305,7 +1396,7 @@ public class ExpressionParser implements ExpressionParserConstants {
       la1tokens[jj_kind] = true;\r
       jj_kind = -1;\r
     }\r
-    for (int i = 0; i < 36; i++) {\r
+    for (int i = 0; i < 39; i++) {\r
       if (jj_la1[i] == jj_gen) {\r
         for (int j = 0; j < 32; j++) {\r
           if ((jj_la1_0[i] & (1<<j)) != 0) {\r
index 327d3e6cda24825ed772bbd5d68d5f186b6c3088..02e21266075a6c56dc997c4d8ef4023d1b258fff 100644 (file)
@@ -15,6 +15,8 @@ import java.util.HashMap;
 \r
 public class ExpressionParser {\r
 \r
+    boolean forIndex = false;\r
+\r
        HashMap<String, List<Token>> references = new HashMap<String, List<Token>>();\r
     \r
     public HashMap<String, List<Token>> getReferences() {\r
@@ -26,6 +28,20 @@ public class ExpressionParser {
     public HashMap<String, List<List<Token>>> getRanges() {\r
         return ranges;\r
     }\r
+\r
+       List<Token> currentRange = null;\r
+\r
+       HashMap<Token, List<Token>> forIndices = new HashMap<Token, List<Token>>();\r
+\r
+    public HashMap<Token, List<Token>> getForIndices() {\r
+        return forIndices;\r
+    }\r
+\r
+    HashMap<String, List<Token>> enumerationReferences = new HashMap<String, List<Token>>();\r
+    \r
+    public HashMap<String, List<Token>> getEnumerationReferences() {\r
+        return enumerationReferences;\r
+    }\r
     \r
     \r
 }\r
@@ -155,7 +171,7 @@ void primary() : {
   | "false"\r
   | "true"\r
   |   LOOKAHEAD( name() "(" ) name() function_call_args()\r
-  | component_reference()\r
+  | component_reference(null)\r
   | "(" output_expression_list() ")"\r
   | "[" expression_list() ( ";" expression_list() )* "]"\r
   | "{" function_arguments() "}"\r
@@ -167,19 +183,31 @@ void name() : {
        <IDENT> ( "." name() )?\r
 }\r
 \r
-void component_reference() : {\r
+void component_reference(Token prevToken) : {\r
 } {\r
        //IDENT [ array_subscripts ] [ "." component_reference ]\r
        <IDENT> {\r
        String name = token.image;\r
-       if(references.get(name) == null) {\r
-               references.put(name, new ArrayList<Token>());\r
+\r
+       // prevToken != null => this is the second part of an enumeration\r
+       if(forIndex == true && prevToken != null) {\r
+               if(enumerationReferences.get(prevToken.image) == null) {\r                       enumerationReferences.put(prevToken.image, new ArrayList<Token>());\r
+               }\r
+               List<Token> list = enumerationReferences.get(prevToken.image);\r
+               list.add(token);                \r
+\r
+       // prevToken == null => this is a normal variable\r
+       } else {\r               if(references.get(name) == null) {\r
+                       references.put(name, new ArrayList<Token>());\r
+               }\r
+               List<Token> list = references.get(name);\r
+               list.add(token);\r
        }\r
-       List<Token> list = references.get(name);\r
-       list.add(token);\r
+\r
+       Token curToken = token;\r
        }\r
        \r
-       ( array_subscripts() )? ( "." component_reference() )?\r
+       ( array_subscripts() )? ( "." component_reference(curToken) )?\r
 }\r
 \r
 \r
@@ -192,9 +220,26 @@ void function_arguments() : {
 } {\r
        //expression [ "," function_arguments | for for_indices ]\r
        //| named_arguments\r
-        LOOKAHEAD(2) expression() ( "," function_arguments())?\r
+        LOOKAHEAD(2) expression() ( "," function_arguments() | "for" for_indices() )?\r
        | named_arguments()\r
-}      \r
+}\r
+\r
+void for_indices() : {\r
+} {\r
+       //for_index {"," for_index}\r
+       for_index() ("," for_index())*\r
+}\r
+\r
+void for_index() : {\r
+} {\r
+       //IDENT [ in expression ]\r
+       <IDENT>\r        {\r
+               forIndices.put(token, currentRange);\r
+               forIndex = true;\r       }\r
+               ( "in" expression() )?\r
+       {\r              forIndex = false;\r
+       }\r
+}\r
 \r
 void named_arguments() : {\r
 } {\r
@@ -221,7 +266,7 @@ void array_subscripts() : {\r        if(ranges.get(token.image) == null) {
                ranges.put(token.image, new ArrayList<List<Token>>());\r
        }\r
        List<List<Token>> rangesList = ranges.get(token.image);\r
-       List<Token> currentRange = new ArrayList<Token>(); \r
+       currentRange = new ArrayList<Token>(); \r
 } {\r
        "[" subscript(currentRange) ( "," subscript(currentRange) )* "]"\r
        {\r