options { STATIC = false; JAVA_UNICODE_ESCAPE = true; } PARSER_BEGIN(Parser) import edu.neu.ccs.demeter.*; public class Parser { // oit is uugly. Why isn't there a Character.valueOf(String)? static char unescapifyChar(String s) { char c = s.charAt(0); if (c == '\\') { switch (s.charAt(1)) { case 'n': c = '\n'; break; case 't': c = '\t'; break; case 'b': c = '\b'; break; case 'r': c = '\r'; break; case 'f': c = '\f'; break; case '\\': c = '\\'; break; case '\'': c = '\''; break; case '\"': c = '\"'; break; default: c = (char) Integer.parseInt(s.substring(1, s.length()), 8); break; } } return c; } // Even uglier... static String unescapify(String s) { char str[] = new char[s.length()]; int i = 0, o = 0; while (i < s.length()) { char c = s.charAt(i++); if (c == '\\') { int j = i + 1; while (j < s.length() && Character.digit(s.charAt(j), 8) != -1) { j++; } c = unescapifyChar(s.substring(i-1, j)); i = j; } str[o++] = c; } return String.valueOf(str, 0, o); } } PARSER_END(Parser) Main _Main() : { Main it = null; } { { it=new Main(); } { return it; } } Histories _Histories() : { Histories it = null; NewStrategy_PList _newstrategy_plist; HistoryPcd_PList _historypcd_plist; } { { it=new Histories(); } _newstrategy_plist=_NewStrategy_PList() { it.set_newstrategy_plist(_newstrategy_plist); } _historypcd_plist=_HistoryPcd_PList() { it.set_historypcd_plist(_historypcd_plist); } { return it; } } HistoryPcd _HistoryPcd() : { HistoryPcd it = null; NewStrategy _newstrategy; } { { it=new HistoryPcd(); } "history" "(" _newstrategy=_NewStrategy() { it.set_newstrategy(_newstrategy); } ")" { return it; } } NewStrategy _NewStrategy() : { NewStrategy it = null; } { ( it=_PrimitiveNewStrategy() | it=_CompositeNewStrategy() ) { return it; } } void common_NewStrategy(NewStrategy it) : { } { { } } PrimitiveNewStrategy _PrimitiveNewStrategy() : { PrimitiveNewStrategy it = null; } { ( it=_Entry() | it=_Exit() ) { return it; } } void common_PrimitiveNewStrategy(PrimitiveNewStrategy it) : { } { common_NewStrategy(it) { } } Entry _Entry() : { Entry it = null; Pointcut _pointcut; } { { it=new Entry(); } "entry" "(" _pointcut=_Pointcut() { it.set_pointcut(_pointcut); } ")" common_PrimitiveNewStrategy(it) { return it; } } Exit _Exit() : { Exit it = null; Pointcut _pointcut; } { { it=new Exit(); } "exit" "(" _pointcut=_Pointcut() { it.set_pointcut(_pointcut); } ")" common_PrimitiveNewStrategy(it) { return it; } } Pointcut _Pointcut() : { Pointcut it = null; PointcutName _pointcutname; } { { it=new Pointcut(); } "pointcut" _pointcutname=_PointcutName() { it.set_pointcutname(_pointcutname); } { return it; } } CompositeNewStrategy _CompositeNewStrategy() : { CompositeNewStrategy it = null; } { ( it=_NamedNewStrategy() | it=_NamedNewStrategyRef() | it=_OrderedNewStrategy() | it=_OrderedWithBypassingNewStrategy() | it=_OptionalNewStrategy() | it=_ZeroOrMoreNewStrategy() ) { return it; } } void common_CompositeNewStrategy(CompositeNewStrategy it) : { } { common_NewStrategy(it) { } } NamedNewStrategy _NamedNewStrategy() : { NamedNewStrategy it = null; } { ( it=_AbstractNewStrategy() | it=_ConcreteNewStrategy() ) { return it; } } void common_NamedNewStrategy(NamedNewStrategy it) : { } { common_CompositeNewStrategy(it) { } } AbstractNewStrategy _AbstractNewStrategy() : { AbstractNewStrategy it = null; Modifiers _modifiers; NewStrategyName _newstrategyname; Formals _formals; } { { it=new AbstractNewStrategy(); } "abstract" [ _modifiers=_Modifiers() { it.set_modifiers(_modifiers); } ] "pattern" _newstrategyname=_NewStrategyName() { it.set_newstrategyname(_newstrategyname); } "(" _formals=_Formals() { it.set_formals(_formals); } ")" common_NamedNewStrategy(it) { return it; } } ConcreteNewStrategy _ConcreteNewStrategy() : { ConcreteNewStrategy it = null; Modifiers _modifiers; NewStrategyName _newstrategyname; Formals _formals; OrderedNewStrategy_BarList _orderednewstrategy_barlist; } { { it=new ConcreteNewStrategy(); } "concrete" [ _modifiers=_Modifiers() { it.set_modifiers(_modifiers); } ] "pattern" _newstrategyname=_NewStrategyName() { it.set_newstrategyname(_newstrategyname); } "(" _formals=_Formals() { it.set_formals(_formals); } ")" "::=" _orderednewstrategy_barlist=_OrderedNewStrategy_BarList() { it.set_orderednewstrategy_barlist(_orderednewstrategy_barlist); } common_NamedNewStrategy(it) { return it; } } NamedNewStrategyRef _NamedNewStrategyRef() : { NamedNewStrategyRef it = null; NewStrategyName _newstrategyname; Actuals _actuals; } { { it=new NamedNewStrategyRef(); } "call" _newstrategyname=_NewStrategyName() { it.set_newstrategyname(_newstrategyname); } "(" _actuals=_Actuals() { it.set_actuals(_actuals); } ")" common_CompositeNewStrategy(it) { return it; } } OrderedNewStrategy _OrderedNewStrategy() : { OrderedNewStrategy it = null; NewStrategy_PList _newstrategy_plist; } { { it=new OrderedNewStrategy(); } "ordered" _newstrategy_plist=_NewStrategy_PList() { it.set_newstrategy_plist(_newstrategy_plist); } common_CompositeNewStrategy(it) { return it; } } OrderedWithBypassingNewStrategy _OrderedWithBypassingNewStrategy() : { OrderedWithBypassingNewStrategy it = null; NewStrategy _first; BypassingNewStrategy_List _bypassingnewstrategy_list; } { { it=new OrderedWithBypassingNewStrategy(); } "ordered with bypassing" "(" _first=_NewStrategy() { it.set_first(_first); } _bypassingnewstrategy_list=_BypassingNewStrategy_List() { it.set_bypassingnewstrategy_list(_bypassingnewstrategy_list); } ")" common_CompositeNewStrategy(it) { return it; } } BypassingNewStrategy _BypassingNewStrategy() : { BypassingNewStrategy it = null; PrimitiveNewStrategy _primitivenewstrategy; NewStrategy _newstrategy; } { { it=new BypassingNewStrategy(); } [ "bypassing" _primitivenewstrategy=_PrimitiveNewStrategy() { it.set_primitivenewstrategy(_primitivenewstrategy); } ] _newstrategy=_NewStrategy() { it.set_newstrategy(_newstrategy); } { return it; } } OptionalNewStrategy _OptionalNewStrategy() : { OptionalNewStrategy it = null; NewStrategy _newstrategy; } { { it=new OptionalNewStrategy(); } "[" _newstrategy=_NewStrategy() { it.set_newstrategy(_newstrategy); } "]" common_CompositeNewStrategy(it) { return it; } } ZeroOrMoreNewStrategy _ZeroOrMoreNewStrategy() : { ZeroOrMoreNewStrategy it = null; NewStrategy _newstrategy; } { { it=new ZeroOrMoreNewStrategy(); } "{" _newstrategy=_NewStrategy() { it.set_newstrategy(_newstrategy); } "}" common_CompositeNewStrategy(it) { return it; } } Modifiers _Modifiers() : { Modifiers it = null; } { { it=new Modifiers(); } "modifiers" { return it; } } Formals _Formals() : { Formals it = null; } { { it=new Formals(); } "formals" { return it; } } Actuals _Actuals() : { Actuals it = null; } { { it=new Actuals(); } "actuals" { return it; } } NewStrategyName _NewStrategyName() : { NewStrategyName it = null; Ident _ident; } { { it=new NewStrategyName(); } _ident=_Ident() { it.set_ident(_ident); } { return it; } } PointcutName _PointcutName() : { PointcutName it = null; Ident _ident; } { { it=new PointcutName(); } _ident=_Ident() { it.set_ident(_ident); } "()" { return it; } } NewStrategy_PList _NewStrategy_PList() : { NewStrategy_PList it = null; Nonempty_NewStrategy_PList _first; } { { it=new NewStrategy_PList(); } "(" [ _first=_Nonempty_NewStrategy_PList() { it.set_first(_first); } ] ")" { return it; } } HistoryPcd_PList _HistoryPcd_PList() : { HistoryPcd_PList it = null; Nonempty_HistoryPcd_PList _first; } { { it=new HistoryPcd_PList(); } "(" [ _first=_Nonempty_HistoryPcd_PList() { it.set_first(_first); } ] ")" { return it; } } OrderedNewStrategy_BarList _OrderedNewStrategy_BarList() : { OrderedNewStrategy_BarList it = null; Nonempty_OrderedNewStrategy_BarList _first; } { { it=new OrderedNewStrategy_BarList(); } "(" _first=_Nonempty_OrderedNewStrategy_BarList() { it.set_first(_first); } ")" { return it; } } BypassingNewStrategy_List _BypassingNewStrategy_List() : { BypassingNewStrategy_List it = null; Nonempty_BypassingNewStrategy_List _first; } { { it=new BypassingNewStrategy_List(); } [ _first=_Nonempty_BypassingNewStrategy_List() { it.set_first(_first); } ] { return it; } } Nonempty_NewStrategy_PList _Nonempty_NewStrategy_PList() : { Nonempty_NewStrategy_PList it = null; NewStrategy _it; Nonempty_NewStrategy_PList _next; } { { it=new Nonempty_NewStrategy_PList(); } _it=_NewStrategy() { it.set_it(_it); } [ _next=_Nonempty_NewStrategy_PList() { it.set_next(_next); } ] { return it; } } Nonempty_HistoryPcd_PList _Nonempty_HistoryPcd_PList() : { Nonempty_HistoryPcd_PList it = null; HistoryPcd _it; Nonempty_HistoryPcd_PList _next; } { { it=new Nonempty_HistoryPcd_PList(); } _it=_HistoryPcd() { it.set_it(_it); } [ _next=_Nonempty_HistoryPcd_PList() { it.set_next(_next); } ] { return it; } } Nonempty_OrderedNewStrategy_BarList _Nonempty_OrderedNewStrategy_BarList() : { Nonempty_OrderedNewStrategy_BarList it = null; OrderedNewStrategy _it; Nonempty_OrderedNewStrategy_BarList _next; } { { it=new Nonempty_OrderedNewStrategy_BarList(); } _it=_OrderedNewStrategy() { it.set_it(_it); } [ "|" _next=_Nonempty_OrderedNewStrategy_BarList() { it.set_next(_next); } ] { return it; } } Nonempty_BypassingNewStrategy_List _Nonempty_BypassingNewStrategy_List() : { Nonempty_BypassingNewStrategy_List it = null; BypassingNewStrategy _it; Nonempty_BypassingNewStrategy_List _next; } { { it=new Nonempty_BypassingNewStrategy_List(); } _it=_BypassingNewStrategy() { it.set_it(_it); } [ _next=_Nonempty_BypassingNewStrategy_List() { it.set_next(_next); } ] { return it; } } boolean _boolean() : { Token t; }{ ( t= { return true; } | t= { return false; } ) } char _char() : { Token t; } { t= { String s = t.image; return unescapifyChar(s.substring(1, s.length()-1)); } } byte _byte() : { int i; } { i=_int() { return (byte) i; } } short _short() : { int i; } { i=_int() { return (short) i; } } int _int() : { Number num; } { num=_Number() { return num.intValue(); } } long _long() : { Number num; } { num=_Number() { return num.longValue(); } } float _float() : { Number num; } { num=_Number() { return num.floatValue(); } } double _double() : { Number num; } { num=_Number() { return num.doubleValue(); } } Boolean _Boolean() : { Token t; }{ ( t= { return Boolean.TRUE; } | t= { return Boolean.FALSE; } ) } Character _Character() : { char c; } { c=_char() { return new Character(c); } } Integer _Integer() : { int i; } { i = _int() { return new Integer(i); } } Long _Long() : { long l; } { l=_long() { return new Long(l); } } Float _Float() : { float f; } { f=_float() { return new Float(f); } } Double _Double() : { double d; } { d=_double() { return new Double(d); } } Number _Number() : { Token t; String s = null; int radix = 0; Number num = null; } { ( ( t= { s = t.image; radix = 10; } | t= { // Strip off the "0x". s = t.image.substring(2, t.image.length()); radix = 16; } | t= { s = t.image; radix = 8; } ) { switch (s.charAt(s.length()-1)) { case 'l': case 'L': s = s.substring(0, s.length()-1); num = new Long(new java.math.BigInteger(s, radix).longValue()); break; default: num = new Integer(new java.math.BigInteger(s, radix).intValue()); break; } } | t= { s = t.image; switch (s.charAt(s.length()-1)) { case 'd': case 'D': num = Double.valueOf(s.substring(0, s.length()-1)); break; case 'f': case 'F': num = Float.valueOf(s.substring(0, s.length()-1)); break; default: num = Float.valueOf(s); break; } } ) { return num; } } String _String() : { Token t; } { t= { String s = t.image; return unescapify(s.substring(1, s.length()-1)); } } StringBuffer _StringBuffer() : { String s; } { s=_String() { return new StringBuffer(s); } } Ident _Ident() : { Token t; } { t= { return new Ident(t.image); } } Text _Text() : { Token t; } { t= { String s = t.image; return new Text(s.substring(2, s.length()-2)); } } Line _Line() : { Token t; } { { token_source.SwitchTo(1); } t= { return new Line(t.image); } } Word _Word() : { Token t; } { { token_source.SwitchTo(2); } t= { return new Word(t.image); } } // Lexical specification (largely taken from Java.jack): SKIP : { " " | "\t" | "\n" | "\r" | <"//" (~["\n","\r"])* ("\n"|"\r\n")> | <"/*" (~["*"])* "*" (~["/"] (~["*"])* "*")* "/"> } TOKEN : { /* LITERALS */ < DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* (["l","L"])? > | < HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ (["l","L"])? > | < OCTAL_LITERAL: "0" (["0"-"7"])* (["l","L"])? > | < FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])+ ()? (["f","F","d","D"])? | "." (["0"-"9"])+ ()? (["f","F","d","D"])? | (["0"-"9"])+ (["f","F","d","D"])? | (["0"-"9"])+ ()? ["f","F","d","D"] > | < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ > | < CHARACTER_LITERAL: "'" ( (~["\'","\\","\n","\r"]) | ("\\" ( ["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] ( ["0"-"7"] )? | ["0"-"3"] ["0"-"7"] ["0"-"7"] ) ) ) "'" > | < STRING_LITERAL: "\"" ( (~["\"","\\","\n","\r"]) | ("\\" ( ["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] ( ["0"-"7"] )? | ["0"-"3"] ["0"-"7"] ["0"-"7"] ) ) )* "\"" > | < TEXT_LITERAL: ( "(@" (~["@"])* ( "@" ~[")"] (~["@"])* )* "@)" ) | ( "{{" (~["}"])* ( "}" ~["}"] (~["}"])* )* "}}" ) > | < TRUE: "true" > | < FALSE: "false" > } TOKEN : { /* IDENTIFIERS */ < IDENTIFIER: (|)* > | < #LETTER: [ "\u0024", "\u0041"-"\u005a", "\u005f", "\u0061"-"\u007a", "\u00c0"-"\u00d6", "\u00d8"-"\u00f6", "\u00f8"-"\u00ff", "\u0100"-"\u1fff", "\u3040"-"\u318f", "\u3300"-"\u337f", "\u3400"-"\u3d2d", "\u4e00"-"\u9fff", "\uf900"-"\ufaff" ] > | < #DIGIT: [ "\u0030"-"\u0039", "\u0660"-"\u0669", "\u06f0"-"\u06f9", "\u0966"-"\u096f", "\u09e6"-"\u09ef", "\u0a66"-"\u0a6f", "\u0ae6"-"\u0aef", "\u0b66"-"\u0b6f", "\u0be7"-"\u0bef", "\u0c66"-"\u0c6f", "\u0ce6"-"\u0cef", "\u0d66"-"\u0d6f", "\u0e50"-"\u0e59", "\u0ed0"-"\u0ed9", "\u1040"-"\u1049" ] > } TOKEN : { < LINE: (~["\n","\r"])* > : DEFAULT } SKIP : { " " | "\t" | "\n" | "\r" } TOKEN : { < WORD: (~[" ","\t","\n","\r"])* > : DEFAULT }