Im Having trouble getting my program to run. Its in java and Heres my code and below are also what the program is supposed to do. Defining the syntax of the SPL, including its basic data types, control structures, and functions. Implementing a lexical analyzer to tokenize the SPL source code into a stream of tokens. Implementing a parser to construct an abstract syntax tree (AST) from the token stream that represents the structure of the program. Implementing a semantic analyzer to check for type errors, undefined variables, and other semantic errors in the program. Generating intermediate code from the AST, such as three-address code or bytecode. Optimizing the intermediate code to improve the efficiency of the generated machine code. Please edit and change my code so it works. I really need it import java.util.*; public class SimpleCalculator { private final String input; private int position; private boolean hasDivByZero = false; private Map symbolTable; private List instructions; public SimpleCalculator(String input) { this.input = input; this.position = 0; this.symbolTable = new HashMap<>(); this.instructions = new ArrayList<>(); } public static void main(String[] args) { SimpleCalculator calculator = new SimpleCalculator("3 + 5 * (2 - 1)"); calculator.parseExpression(); if (calculator.hasDivByZero) { System.out.println("Error: division by zero"); } else { System.out.println("Result: " + calculator.instructions); } } public void parseExpression() { parseTerm('+'); } public String parseTerm(char op) { String t1 = parseFactor(); while (peek() == op || peek() == '/') { char operator = consume(); String t2 = parseFactor(); if (operator == '/' && t2.equals("0")) { hasDivByZero = true; break; } String result = newTemp(); emit(result + " = " + t1 + " " + operator + " " + t2); t1 = result; } return t1; } public String parseFactor() { if (consume('(')) { String result = parseExpression(); consume(')'); return result; } StringBuilder sb = new StringBuilder(); while (Character.isDigit(peek())) { sb.append(consume()); } String variable = sb.toString(); Optional.ofNullable(symbolTable.get(variable)) .filter(type -> type.equals("int")) .orElseThrow(() -> new IllegalArgumentException("Error: " + variable + " is not defined or not an integer")); return variable; } private String newTemp() { String temp = "t" + (instructions.size() + 1); symbolTable.put(temp, "int"); return temp; } private void emit(String instruction) { instructions.add(instruction); } private char consume() { return input.charAt(position++); } private boolean consume(char c) { if (peek() == c) { position++; return true; } return false; } private char peek() { return position < input.length() ? input.charAt(position) : '\0'; } }
Im Having trouble getting my
- Defining the syntax of the SPL, including its basic data types, control structures, and functions.
- Implementing a lexical analyzer to tokenize the SPL source code into a stream of tokens.
- Implementing a parser to construct an abstract syntax tree (AST) from the token stream that represents the structure of the program.
- Implementing a semantic analyzer to check for type errors, undefined variables, and other semantic errors in the program.
- Generating intermediate code from the AST, such as three-address code or bytecode.
- Optimizing the intermediate code to improve the efficiency of the generated machine code.
Please edit and change my code so it works. I really need it
import java.util.*;
public class SimpleCalculator {
private final String input;
private int position;
private boolean hasDivByZero = false;
private Map<String, String> symbolTable;
private List<String> instructions;
public SimpleCalculator(String input) {
this.input = input;
this.position = 0;
this.symbolTable = new HashMap<>();
this.instructions = new ArrayList<>();
}
public static void main(String[] args) {
SimpleCalculator calculator = new SimpleCalculator("3 + 5 * (2 - 1)");
calculator.parseExpression();
if (calculator.hasDivByZero) {
System.out.println("Error: division by zero");
} else {
System.out.println("Result: " + calculator.instructions);
}
}
public void parseExpression() {
parseTerm('+');
}
public String parseTerm(char op) {
String t1 = parseFactor();
while (peek() == op || peek() == '/') {
char operator = consume();
String t2 = parseFactor();
if (operator == '/' && t2.equals("0")) {
hasDivByZero = true;
break;
}
String result = newTemp();
emit(result + " = " + t1 + " " + operator + " " + t2);
t1 = result;
}
return t1;
}
public String parseFactor() {
if (consume('(')) {
String result = parseExpression();
consume(')');
return result;
}
StringBuilder sb = new StringBuilder();
while (Character.isDigit(peek())) {
sb.append(consume());
}
String variable = sb.toString();
Optional.ofNullable(symbolTable.get(variable))
.filter(type -> type.equals("int"))
.orElseThrow(() -> new IllegalArgumentException("Error: " + variable + " is not defined or not an integer"));
return variable;
}
private String newTemp() {
String temp = "t" + (instructions.size() + 1);
symbolTable.put(temp, "int");
return temp;
}
private void emit(String instruction) {
instructions.add(instruction);
}
private char consume() {
return input.charAt(position++);
}
private boolean consume(char c) {
if (peek() == c) {
position++;
return true;
}
return false;
}
private char peek() {
return position < input.length() ? input.charAt(position) : '\0';
}
}
Step by step
Solved in 3 steps