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;
String _s;
} {
{ it=new Main(); }
_s=_String() { it.set_s(_s); }
{ return it; }
}
CSP _CSP() : {
CSP it = null;
ConstraintList _constraintlist;
} {
{ it=new CSP(); }
_constraintlist=_ConstraintList() { it.set_constraintlist(_constraintlist); }
{ return it; }
}
Constraint _Constraint() : {
Constraint it = null;
} {
( it=_OldC() | it=_NewC() )
{ return it; }
}
void common_Constraint(Constraint it) : {
} {
{ }
}
NewC _NewC() : {
NewC it = null;
Weight _weight;
VariableList _variablelist;
Kind _kind;
int _constant;
} {
{ it=new NewC(); }
_weight=_Weight() { it.set_weight(_weight); }
_variablelist=_VariableList() { it.set_variablelist(_variablelist); }
_kind=_Kind() { it.set_kind(_kind); }
_constant=_int() { it.set_constant(_constant); }
common_Constraint(it)
{ return it; }
}
OldC _OldC() : {
OldC it = null;
Weight _weight;
Relation _relation;
VariableList _variablelist;
} {
{ it=new OldC(); }
"" "" _weight=_Weight() { it.set_weight(_weight); }
"" "" _relation=_Relation() { it.set_relation(_relation); }
"" "" _variablelist=_VariableList() { it.set_variablelist(_variablelist); }
"" "" common_Constraint(it)
{ return it; }
}
Kind _Kind() : {
Kind it = null;
} {
( it=_Exact() | it=_GreaterThanEqual() | it=_LessThanEqual() )
{ return it; }
}
void common_Kind(Kind it) : {
} {
{ }
}
Exact _Exact() : {
Exact it = null;
} {
{ it=new Exact(); }
"=" common_Kind(it)
{ return it; }
}
GreaterThanEqual _GreaterThanEqual() : {
GreaterThanEqual it = null;
} {
{ it=new GreaterThanEqual(); }
">=" common_Kind(it)
{ return it; }
}
LessThanEqual _LessThanEqual() : {
LessThanEqual it = null;
} {
{ it=new LessThanEqual(); }
"<=" common_Kind(it)
{ return it; }
}
Variable _Variable() : {
Variable it = null;
Ident _v;
} {
{ it=new Variable(); }
_v=_Ident() { it.set_v(_v); }
{ return it; }
}
Relation _Relation() : {
Relation it = null;
int _v;
} {
{ it=new Relation(); }
_v=_int() { it.set_v(_v); }
{ return it; }
}
Weight _Weight() : {
Weight it = null;
int _v;
} {
{ it=new Weight(); }
_v=_int() { it.set_v(_v); }
{ return it; }
}
ConstraintList _ConstraintList() : {
ConstraintList it = null;
} {
( it=_NECL() | it=_ECL() )
{ return it; }
}
void common_ConstraintList(ConstraintList it) : {
} {
{ }
}
NECL _NECL() : {
NECL it = null;
Constraint _first;
ConstraintList _rest;
} {
{ it=new NECL(); }
_first=_Constraint() { it.set_first(_first); }
_rest=_ConstraintList() { it.set_rest(_rest); }
common_ConstraintList(it)
{ return it; }
}
ECL _ECL() : {
ECL it = null;
} {
{ it=new ECL(); }
common_ConstraintList(it)
{ return it; }
}
VariableList _VariableList() : {
VariableList it = null;
} {
( it=_NEVL() | it=_EVL() )
{ return it; }
}
void common_VariableList(VariableList it) : {
} {
{ }
}
NEVL _NEVL() : {
NEVL it = null;
Variable _first;
VariableList _rest;
} {
{ it=new NEVL(); }
_first=_Variable() { it.set_first(_first); }
_rest=_VariableList() { it.set_rest(_rest); }
common_VariableList(it)
{ return it; }
}
EVL _EVL() : {
EVL it = null;
} {
{ it=new EVL(); }
common_VariableList(it)
{ 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
}