Skip to content

nguyenminh-phuc/MiniJava

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MiniJava

GUI

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:

  1. Parse source file to generate a syntax tree, report any syntax errors.
  2. Traverse the syntax tree, building a symbol table and reporting any semantic errors.
  3. Interpret and print the results to console.
  4. Generate CIL (MSIL) bytecode.

Grammar

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>

Lexical Issues

  • Identifiers: An identifier is a sequence of letters, digits, and underscores, starting with a letter. Uppercase letters are distinguished from lowercase.
  • Integer literals: A sequence of decimal digits is an integer constant that denotes the corresponding integer value.
  • Comments: A comment may appear between any two tokens. There are two forms of comments: one starts with /*, ends with */; another begins with // and goes to the end of the line.

Sample Program

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;
    }
}

Usage

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
    }