initial commit, template added
This commit is contained in:
144
MicroJava Compiler/src/ssw/mj/impl/Parser.java
Normal file
144
MicroJava Compiler/src/ssw/mj/impl/Parser.java
Normal file
@@ -0,0 +1,144 @@
|
||||
package ssw.mj.impl;
|
||||
|
||||
import ssw.mj.Errors;
|
||||
import ssw.mj.Errors.Message;
|
||||
import ssw.mj.scanner.Token;
|
||||
|
||||
import static ssw.mj.Errors.Message.TOKEN_EXPECTED;
|
||||
import static ssw.mj.scanner.Token.Kind.eof;
|
||||
import static ssw.mj.scanner.Token.Kind.none;
|
||||
|
||||
public final class Parser {
|
||||
|
||||
/**
|
||||
* Maximum number of global variables per program
|
||||
*/
|
||||
private static final int MAX_GLOBALS = 32767;
|
||||
|
||||
/**
|
||||
* Maximum number of fields per class
|
||||
*/
|
||||
private static final int MAX_FIELDS = 32767;
|
||||
|
||||
/**
|
||||
* Maximum number of local variables per method
|
||||
*/
|
||||
private static final int MAX_LOCALS = 127;
|
||||
|
||||
/**
|
||||
* Last recognized token;
|
||||
*/
|
||||
private Token t;
|
||||
|
||||
/**
|
||||
* Lookahead token (not recognized).)
|
||||
*/
|
||||
private Token la;
|
||||
|
||||
/**
|
||||
* Shortcut to kind attribute of lookahead token (la).
|
||||
*/
|
||||
private Token.Kind sym;
|
||||
|
||||
/**
|
||||
* According scanner
|
||||
*/
|
||||
public final Scanner scanner;
|
||||
|
||||
/**
|
||||
* According code buffer
|
||||
*/
|
||||
public final Code code;
|
||||
|
||||
/**
|
||||
* According symbol table
|
||||
*/
|
||||
public final Tab tab;
|
||||
|
||||
public Parser(Scanner scanner) {
|
||||
this.scanner = scanner;
|
||||
tab = new Tab(this);
|
||||
code = new Code(this);
|
||||
// Pseudo token to avoid crash when 1st symbol has scanner error.
|
||||
la = new Token(none, 1, 1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reads ahead one symbol.
|
||||
*/
|
||||
private void scan() {
|
||||
t = la;
|
||||
la = scanner.next();
|
||||
sym = la.kind;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies symbol and reads ahead.
|
||||
*/
|
||||
private void check(Token.Kind expected) {
|
||||
if (sym == expected) {
|
||||
scan();
|
||||
} else {
|
||||
error(TOKEN_EXPECTED, expected);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds error message to the list of errors.
|
||||
*/
|
||||
public void error(Message msg, Object... msgParams) {
|
||||
// TODO Exercise UE-P-3: Replace panic mode with error recovery (i.e., keep track of error distance)
|
||||
// TODO Exercise UE-P-3: Hint: Replacing panic mode also affects scan() method
|
||||
scanner.errors.error(la.line, la.col, msg, msgParams);
|
||||
throw new Errors.PanicMode();
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the analysis.
|
||||
*/
|
||||
public void parse() {
|
||||
scan(); // scan first symbol, initializes look-ahead
|
||||
Program(); // start analysis
|
||||
check(eof);
|
||||
}
|
||||
|
||||
|
||||
// ===============================================
|
||||
// TODO Exercise UE-P-2: Implementation of parser
|
||||
// TODO Exercise UE-P-3: Error recovery methods
|
||||
// TODO Exercise UE-P-4: Symbol table handling
|
||||
// TODO Exercise UE-P-5-6: Code generation
|
||||
// ===============================================
|
||||
|
||||
// TODO Exercise UE-P-3: Error distance
|
||||
|
||||
// TODO Exercise UE-P-2 + Exercise 3: Sets to handle certain first, follow, and recover sets
|
||||
|
||||
static {
|
||||
// Initialize first and follow sets.
|
||||
}
|
||||
|
||||
// ---------------------------------
|
||||
|
||||
// TODO Exercise UE-P-2: One top-down parsing method per production
|
||||
|
||||
/**
|
||||
* Program = <br>
|
||||
* "program" ident <br>
|
||||
* { ConstDecl | VarDecl | ClassDecl } <br>
|
||||
* "{" { MethodDecl } "}" .
|
||||
*/
|
||||
private void Program() {
|
||||
// TODO Exercise UE-P-2
|
||||
}
|
||||
|
||||
// ...
|
||||
|
||||
// ------------------------------------
|
||||
|
||||
// TODO Exercise UE-P-3: Error recovery methods: recoverDecl, recoverMethodDecl and recoverStat (+ TODO Exercise UE-P-5: Check idents for Type kind)
|
||||
|
||||
// ====================================
|
||||
// ====================================
|
||||
}
|
||||
Reference in New Issue
Block a user