")}("visibility","visible",["\/lib\/bootstrap\/css\/bootstrap.min.css"],"rel=\u0022stylesheet\u0022 ");
MiniJava is a small subset of Java.
The meaning of a MiniJava program is given by its meaning as a Java program. Overloading is not allowed in MiniJava. The MiniJava statement System.out.println(expr);
can only print integers. The MiniJava expression expr.length
only applies to expressions of type int[]
.
The program operates in four main stages:
Program | ::= | MainClass ( ClassDeclaration )* <EOF> |
MainClass | ::= | "class" Identifier "{" "public" "static" "void" "main" "(" "String" "[" "]" Identifier ")" "{" Statement "}" "}" |
ClassDeclaration | ::= | "class" Identifier ( "extends" Identifier )? "{" ( VarDeclaration )* ( MethodDeclaration )* "}" |
VarDeclaration | ::= | Type Identifier ";" |
MethodDeclaration | ::= | "public" Type Identifier "(" ( Type Identifier ( "," Type Identifier )* )? ")" "{" ( VarDeclaration )* ( Statement )* "return" Expression ";" "}" |
Type | ::= | "int" "[" "]" |
| | "boolean" | |
| | "int" | |
| | Identifier | |
Statement | ::= | "{" ( Statement )* "}" |
| | "if" "(" Expression ")" Statement "else" Statement | |
| | "while" "(" Expression ")" Statement | |
| | "System.out.println" "(" Expression ")" ";" | |
| | Identifier "=" Expression ";" | |
| | Identifier "[" Expression "]" "=" Expression ";" | |
Expression | ::= | Expression ( "&&" | "<" | "+" | "-" | "*" ) Expression |
| | Expression "[" Expression "]" | |
| | Expression "." "length" | |
| | Expression "." Identifier "(" ( Expression ( "," Expression )* )? ")" | |
| | <INTEGER_LITERAL> | |
| | "true" | |
| | "false" | |
| | Identifier | |
| | "this" | |
| | "new" "int" "[" Expression "]" | |
| | "new" Identifier "(" ")" | |
| | "!" Expression | |
| | "(" Expression ")" | |
Identifier | ::= | <IDENTIFIER> |
class Factorial {
public static void main(String[] a) {
System.out.println(new Fac().ComputeFac(10));
}
}
class Fac {
public int ComputeFac(int num) {
int num_aux;
if (num < 1) num_aux = 1;
else num_aux = num * (this.ComputeFac(num - 1));
return num_aux;
}
}
let source = "<MiniJava source code>"
let result =
Utils.result {
let input = Input.create source
let! tokens = Lexer.tokenize input
let! program = Parser.parse tokens
let! symbolTable = SymbolCollector.create program
let! _ = TypeChecker.check symbolTable program
let! _ = VariableInitializationChecker.check program
let env = Environment.create symbolTable program (printfn "%d") 1000L
let! newEnv = Interpreter.interpret env
let! assembly = ILBuilder.build symbolTable program
let! app = CodeGenerator.generate assembly
return newEnv, assembly, app
}