fix a grammar to allow multiple annotations on method parameter
authoryeom <yeom>
Tue, 9 Aug 2011 00:43:48 +0000 (00:43 +0000)
committeryeom <yeom>
Tue, 9 Aug 2011 00:43:48 +0000 (00:43 +0000)
Robust/src/IR/Tree/BuildIR.java
Robust/src/Parse/java14.cup

index 30440944e12ba848cfe29967e08b5b00dd2cc796..7f38a88b53cabf3049bfbb0921ea51ef6eb22b97 100644 (file)
@@ -1632,8 +1632,8 @@ public class BuildIR {
 
         md.addParameter(type, paramname);
         if(isNode(paramn, "annotation_parameter")) {
-          ParseNode bodynode=paramn.getChild("annotation_body");
-          parseParameterAnnotation(bodynode,type);
+          ParseNode listnode=paramn.getChild("annotation_list");
+          parseParameterAnnotation(listnode,type);
         }
 
       }
@@ -1697,16 +1697,35 @@ public class BuildIR {
     }
   }
 
-  private void parseParameterAnnotation(ParseNode body_list,TypeDescriptor type) {
-    ParseNode body_node = body_list.getFirstChild();
-    if (isNode(body_node, "marker_annotation")) {
-      type.addAnnotationMarker(new AnnotationDescriptor(body_node.getChild("name").getTerminal()));
-    } else if (isNode(body_node, "single_annotation")) {
-      type.addAnnotationMarker(new AnnotationDescriptor(body_node.getChild("name").getTerminal(),
-                                                        body_node.getChild("element_value").getTerminal()));
-    } else if (isNode(body_node, "normal_annotation")) {
-      throw new Error("Annotation with multiple data members is not supported yet.");
+  private void parseParameterAnnotation(ParseNode pn,TypeDescriptor type) {
+    
+    
+    ParseNodeVector pnv = pn.getChildren();
+    for (int i = 0; i < pnv.size(); i++) {
+      ParseNode body_list = pnv.elementAt(i);
+      if (isNode(body_list, "annotation_body")) {
+        ParseNode body_node = body_list.getFirstChild();
+        if (isNode(body_node, "marker_annotation")) {
+          type.addAnnotationMarker(new AnnotationDescriptor(body_node.getChild("name").getTerminal()));
+        } else if (isNode(body_node, "single_annotation")) {
+          type.addAnnotationMarker(new AnnotationDescriptor(body_node.getChild("name").getTerminal(),
+                                                   body_node.getChild("element_value").getTerminal()));
+        } else if (isNode(body_node, "normal_annotation")) {
+          throw new Error("Annotation with multiple data members is not supported yet.");
+        }
+      }
     }
+    
+    
+//    ParseNode body_node = body_list.getFirstChild();
+//    if (isNode(body_node, "marker_annotation")) {
+//      type.addAnnotationMarker(new AnnotationDescriptor(body_node.getChild("name").getTerminal()));
+//    } else if (isNode(body_node, "single_annotation")) {
+//      type.addAnnotationMarker(new AnnotationDescriptor(body_node.getChild("name").getTerminal(),
+//                                                        body_node.getChild("element_value").getTerminal()));
+//    } else if (isNode(body_node, "normal_annotation")) {
+//      throw new Error("Annotation with multiple data members is not supported yet.");
+//    }
   }
 
   private boolean isNode(ParseNode pn, String label) {
index b6287157849b87641d55c6e1ef4f14e23e6dd72f..7e8f0d886e6d8ca1798d1aa56f5373a613747fd9 100644 (file)
@@ -1179,7 +1179,7 @@ formal_parameter ::=
                pn.addChild(name);
                RESULT=pn;
        :}
-       |       annotation:an type:type variable_declarator_id:name {:
+       |       annotations:an type:type variable_declarator_id:name {:
                ParseNode pn=new ParseNode("annotation_parameter",parser.lexer.line_num);
                pn.addChild(type);
                pn.addChild(name);