rendered paste bodyPARSER_BEGIN(MiniSParser)
package parser;
public class MiniSParser {}
PARSER_END(MiniSParser)
/* SCANNER */
/* Skip whitespace */
SKIP : { " " | "\t" | "\n" | "\r" }
/* Reserved words */
TOKEN: {
< FOR: "for">
| < IF: "if">
| < FI: "fi">
| < DO: "do">
| < OD: "od">
| < UNTIL: "until">
| < NOT: "not">
| < THEN: "then">
}
/* Numerals */
TOKEN: {
< NUMERAL: (["0"-"9"])+ "." (["0"-"9"])+ >
}
/* Operators */
TOKEN: {
< ASSIGN: "=" >
}
/* Identifiers */
TOKEN: {
< ID: ["A"-"Z", "a"-"z"](["0"-"9"]|["a"-"z"]|["A"-"Z"])* >
}
/* Illegal */
TOKEN: {
< ERROR: ~[] >
}
/* PARSER */
Prgram start() : {}
{
stmt() <EOF>
{ return jjtThis; }
}
void stmt() : {}
{
forStmt()
| ifStmt()
| assignment()
}
void forStmt() : {}
{
<FOR> ID "=" expr() <UNTIL> expr() <DO> stmt() <OD>
}
void ifStmt() : {}
{
<IF> expr() <THEN> stmt() <FI>
}
void assignment() : {}
{
ID "=" expr()
}
void expr() : {}
{
ID
| NUMERAL
| <NOT> expr()
}