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)
ShoeOrder _ShoeOrder() : {
ShoeOrder it = null;
String _id;
String _style;
Ident _color;
String _size;
Width _width;
Store_List _stores;
} {
{ it=new ShoeOrder(); }
"" "id=" _id=_String() { it.set_id(_id); }
"style=" _style=_String() { it.set_style(_style); }
"" _color=_Ident() { it.set_color(_color); }
"" "" _size=_String() { it.set_size(_size); }
"" _width=_Width() { it.set_width(_width); }
[ "" _stores=_Store_List() { it.set_stores(_stores); } "" ]
"" { return it; }
}
Width _Width() : {
Width it = null;
W _w;
} {
{ it=new Width(); }
"" _w=_W() { it.set_w(_w); }
"" { return it; }
}
W _W() : {
W it = null;
} {
( it=_AA() | it=_EE() )
{ return it; }
}
void common_W(W it) : {
} {
{ }
}
AA _AA() : {
AA it = null;
} {
{ it=new AA(); }
"aa" common_W(it)
{ return it; }
}
EE _EE() : {
EE it = null;
} {
{ it=new EE(); }
"ee" common_W(it)
{ return it; }
}
Store _Store() : {
Store it = null;
Ident _name;
Quantity _howManySuchShoes;
} {
{ it=new Store(); }
_name=_Ident() { it.set_name(_name); }
_howManySuchShoes=_Quantity() { it.set_howManySuchShoes(_howManySuchShoes); }
{ return it; }
}
Quantity _Quantity() : {
Quantity it = null;
Number _number;
} {
{ it=new Quantity(); }
_number=_Number() { it.set_number(_number); }
{ return it; }
}
Main _Main() : {
Main it = null;
} {
{ it=new Main(); }
{ return it; }
}
SummingVisitor _SummingVisitor() : {
SummingVisitor it = null;
int _total;
} {
{ it=new SummingVisitor(); }
_total=_int() { it.set_total(_total); }
{ return it; }
}
Store_List _Store_List() : {
Store_List it = null;
Nonempty_Store_List _first;
} {
{ it=new Store_List(); }
[ _first=_Nonempty_Store_List() { it.set_first(_first); } ]
{ return it; }
}
Nonempty_Store_List _Nonempty_Store_List() : {
Nonempty_Store_List it = null;
Store _it;
Nonempty_Store_List _next;
} {
{ it=new Nonempty_Store_List(); }
_it=_Store() { it.set_it(_it); }
[ _next=_Nonempty_Store_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
}