options {
STATIC = false;
JAVA_UNICODE_ESCAPE = true;
}
PARSER_BEGIN(Parser)
import java.io.PrintStream;
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)
Program _Program() : {
Program it = null;
Expression_List _exps;
} {
{ it=new Program(); }
"" _exps=_Expression_List() { it.set_exps(_exps); }
""
{ return it; }
}
Expression _Expression() : {
Expression it = null;
} {
( it=_LetExp() | it=_CNF() )
{ return it; }
}
void common_Expression(Expression it) : {
} {
{ }
}
LetExp _LetExp() : {
LetExp it = null;
Literal _assignment;
Expression _body;
} {
{ it=new LetExp(); }
"" "" _assignment=_Literal() { it.set_assignment(_assignment); }
"" _body=_Expression() { it.set_body(_body); }
"" common_Expression(it)
{ return it; }
}
CNF _CNF() : {
CNF it = null;
CNFType _cnftype;
Clause_List _clauses;
ClauseCount _sat;
ClauseCount _unsat;
} {
{ it=new CNF(); }
"" [ _cnftype=_CNFType() { it.set_cnftype(_cnftype); } ]
"" _clauses=_Clause_List() { it.set_clauses(_clauses); }
"" [ "" _sat=_ClauseCount() { it.set_sat(_sat); } "" ]
[ "" _unsat=_ClauseCount() { it.set_unsat(_unsat); } "" ]
"" common_Expression(it)
{ return it; }
}
CNFType _CNFType() : {
CNFType it = null;
ClauseType_List _clausetype_list;
} {
{ it=new CNFType(); }
"" _clausetype_list=_ClauseType_List() { it.set_clausetype_list(_clausetype_list); }
"" { return it; }
}
ClauseType _ClauseType() : {
ClauseType it = null;
ClauseLength _length;
ClauseLength _pos;
} {
{ it=new ClauseType(); }
"" { return it; }
}
Clause _Clause() : {
Clause it = null;
Weight _weight;
Literals _literals;
} {
{ it=new Clause(); }
"" _literals=_Literals() { it.set_literals(_literals); }
"" { return it; }
}
Literals _Literals() : {
Literals it = null;
Literal_List _literals;
} {
{ it=new Literals(); }
"" _literals=_Literal_List() { it.set_literals(_literals); }
"" { return it; }
}
Literal _Literal() : {
Literal it = null;
} {
( it=_Pos() | it=_Neg() )
{ return it; }
}
void common_Literal(Literal it) : {
} {
{ }
}
Pos _Pos() : {
Pos it = null;
Variable _variable;
} {
{ it=new Pos(); }
"" _variable=_Variable() { it.set_variable(_variable); }
"" common_Literal(it)
{ return it; }
}
Neg _Neg() : {
Neg it = null;
Variable _variable;
} {
{ it=new Neg(); }
"" _variable=_Variable() { it.set_variable(_variable); }
"" common_Literal(it)
{ return it; }
}
Variable _Variable() : {
Variable it = null;
Ident _v;
} {
{ it=new Variable(); }
_v=_Ident() { it.set_v(_v); }
{ return it; }
}
Weight _Weight() : {
Weight it = null;
String _v;
} {
{ it=new Weight(); }
_v=_String() { it.set_v(_v); }
{ return it; }
}
ClauseCount _ClauseCount() : {
ClauseCount it = null;
int _v;
} {
{ it=new ClauseCount(); }
"" _v=_int() { it.set_v(_v); }
"" { return it; }
}
ClauseLength _ClauseLength() : {
ClauseLength it = null;
String _v;
} {
{ it=new ClauseLength(); }
_v=_String() { it.set_v(_v); }
{ return it; }
}
Main _Main() : {
Main it = null;
String _s;
} {
{ it=new Main(); }
_s=_String() { it.set_s(_s); }
{ return it; }
}
Expression_List _Expression_List() : {
Expression_List it = null;
Nonempty_Expression_List _first;
} {
{ it=new Expression_List(); }
[ _first=_Nonempty_Expression_List() { it.set_first(_first); } ]
{ return it; }
}
Clause_List _Clause_List() : {
Clause_List it = null;
Nonempty_Clause_List _first;
} {
{ it=new Clause_List(); }
[ _first=_Nonempty_Clause_List() { it.set_first(_first); } ]
{ return it; }
}
ClauseType_List _ClauseType_List() : {
ClauseType_List it = null;
Nonempty_ClauseType_List _first;
} {
{ it=new ClauseType_List(); }
[ _first=_Nonempty_ClauseType_List() { it.set_first(_first); } ]
{ return it; }
}
Literal_List _Literal_List() : {
Literal_List it = null;
Nonempty_Literal_List _first;
} {
{ it=new Literal_List(); }
[ _first=_Nonempty_Literal_List() { it.set_first(_first); } ]
{ return it; }
}
Nonempty_Expression_List _Nonempty_Expression_List() : {
Nonempty_Expression_List it = null;
Expression _it;
Nonempty_Expression_List _next;
} {
{ it=new Nonempty_Expression_List(); }
_it=_Expression() { it.set_it(_it); }
[ _next=_Nonempty_Expression_List() { it.set_next(_next); } ]
{ return it; }
}
Nonempty_Clause_List _Nonempty_Clause_List() : {
Nonempty_Clause_List it = null;
Clause _it;
Nonempty_Clause_List _next;
} {
{ it=new Nonempty_Clause_List(); }
_it=_Clause() { it.set_it(_it); }
[ _next=_Nonempty_Clause_List() { it.set_next(_next); } ]
{ return it; }
}
Nonempty_ClauseType_List _Nonempty_ClauseType_List() : {
Nonempty_ClauseType_List it = null;
ClauseType _it;
Nonempty_ClauseType_List _next;
} {
{ it=new Nonempty_ClauseType_List(); }
_it=_ClauseType() { it.set_it(_it); }
[ _next=_Nonempty_ClauseType_List() { it.set_next(_next); } ]
{ return it; }
}
Nonempty_Literal_List _Nonempty_Literal_List() : {
Nonempty_Literal_List it = null;
Literal _it;
Nonempty_Literal_List _next;
} {
{ it=new Nonempty_Literal_List(); }
_it=_Literal() { it.set_it(_it); }
[ _next=_Nonempty_Literal_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
}