options {
STATIC = false;
}
PARSER_BEGIN(WhileParser)
class WhileParser {
public static void main(String[] args) throws ParseException, TokenMgrError {
WhileParser parser = new WhileParser(System.in);
parser.Start();
}
}
PARSER_END(WhileParser)
SKIP : { " " | "\t" | "\n" | "\r" | < "//"(~["\n", "\r"])* ("\n" | "\r" | "\r\n")> }
TOKEN : { < INTLIT: "0" | ["1"-"9"](["0"-"9"])* > }
TOKEN : { < STRLIT: "\"" (~["\"", "\n", "\r"])* "\"" > }TOKEN : { < IF: "if" > }
TOKEN : { < IF: "if" > }
TOKEN : { < ELSE: "else" > }
TOKEN : { < WHILE: "while" > }
TOKEN : { < PRINTLN: "println" > }
TOKEN : { < ID: <LETTER> (<LETTER> | ["0"-"9"])* > | < #LETTER: ["$","A"-"Z","a"-"z","_"] > }
void Start() :
{}
{
(Statement())* <EOF>
}
void Statement() :
{}
{
Print() | Assign() | If() | While() | Block()
}
void Print() :
{}
{
<PRINTLN> "(" <STRLIT> "," <ID> ")" ";"
}
void Assign() :
{}
{
<ID> "=" Expr() ";"
}
void If() :
{}
{
<IF> "(" Expr() ")" Block() (<ELSE> Statement())?
}
void While() :
{}
{
<WHILE> "(" Expr() ")" Statement()
}
void Block() :
{}
{
"{" (Statement())* "}"
}
void Expr() :
{}
{
<ID>
| <INTLIT>
| (Expr() ("+" | "-" | "*" | "/" | "%" | "<" | ">" | "==" | "&&" | "||") Expr())
| (("!" | "-") Expr())
| ("(" Expr() ")")
}