From 2ed078286d29cacdc9bb531d6b877ab52121d9dd Mon Sep 17 00:00:00 2001 From: yeom Date: Tue, 9 Aug 2011 00:43:48 +0000 Subject: [PATCH] fix a grammar to allow multiple annotations on method parameter --- Robust/src/IR/Tree/BuildIR.java | 41 ++++++++++++++++++++++++--------- Robust/src/Parse/java14.cup | 2 +- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/Robust/src/IR/Tree/BuildIR.java b/Robust/src/IR/Tree/BuildIR.java index 30440944..7f38a88b 100644 --- a/Robust/src/IR/Tree/BuildIR.java +++ b/Robust/src/IR/Tree/BuildIR.java @@ -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) { diff --git a/Robust/src/Parse/java14.cup b/Robust/src/Parse/java14.cup index b6287157..7e8f0d88 100644 --- a/Robust/src/Parse/java14.cup +++ b/Robust/src/Parse/java14.cup @@ -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); -- 2.34.1