private static boolean rule_assignment(DefaultMutableTreeNode parent) { boolean error = false; DefaultMutableTreeNode node; String iden = tokens.get(currentToken).getWord(); node = new DefaultMutableTreeNode("identifier" + "(" + tokens.get(currentToken).getWord() + ")"); parent.add(node); String s = tokens.get(currentToken).getWord(); if (SemanticAnalyzer.getSymbolTable().get(s) != null) SemanticAnalyzer.pushStack(SemanticAnalyzer.getSymbolTable().get(s).firstElement().getType()); else { SemanticAnalyzer.pushStack("ERROR"); SemanticAnalyzer.error(getgui(), 0, getlineno(), s); } currentToken++; if (currentToken < tokens.size() && tokens.get(currentToken).getWord().equals("=")) { node = new DefaultMutableTreeNode("="); parent.add(node); currentToken++; } else { error(5); while (currentToken < tokens.size() && !(tokens.get(currentToken).getWord().equals("!") || tokens.get(currentToken).getWord().equals("-") || tokens.get(currentToken).getToken().equals("INTEGER") || tokens.get(currentToken).getToken().equals("OCTAL") || tokens.get(currentToken).getToken().equals("HEXADECIMAL") || tokens.get(currentToken).getToken().equals("BINARY") || tokens.get(currentToken).getToken().equals("STRING") || tokens.get(currentToken).getToken().equals("CHARACTER") || tokens.get(currentToken).getToken().equals("FLOAT") || tokens.get(currentToken).getToken().equals("IDENTIFIER") || tokens.get(currentToken).getWord().equals("true") || tokens.get(currentToken).getWord().equals("false") || tokens.get(currentToken).getWord().equals("(") || tokens.get(currentToken).getWord().equals(")") || tokens.get(currentToken).getWord().equals(";"))) { currentToken++; } } node = new DefaultMutableTreeNode("expression"); parent.add(node); error = rule_expression(node); String s1 = SemanticAnalyzer.popStack(); String s2 = SemanticAnalyzer.popStack(); String operator = "="; String res = SemanticAnalyzer.calculateCube(s1, s2, operator); CodeGenerator.addInstruction("STO", iden, "0"); if (res.equals("ERROR")) SemanticAnalyzer.error(getgui(), 2, getlineno(), ""); return error; }
public static DefaultMutableTreeNode run(Vector<Token> t, Gui gui) { Parser.gui = gui; tokens = t; currentToken = 0; root = new DefaultMutableTreeNode("program"); // rule_program(root); CodeGenerator.addInstruction("OPR", "0", "0"); // gui.writeSymbolTable(SemanticAnalyzer.getSymbolTable()); CodeGenerator.writeCode(gui); SemanticAnalyzer.getSymbolTable().clear(); SemanticAnalyzer.getStack().clear(); CodeGenerator.clear(gui); return root; }
/** * Run * * @param Vector<Token> t, Gui gui * @return DefaultMutableTreeNode */ public static DefaultMutableTreeNode run(Vector<A2.Token> t, Gui gui) { Parser.gui = gui; tokens = t; currentToken = 0; SemanticAnalyzer.reset(); // reset the data structures root = new DefaultMutableTreeNode("program"); rule_program(root); gui.writeSymbolTable(SemanticAnalyzer.getSymbolTable()); return root; }
private static boolean rule_C(DefaultMutableTreeNode parent) { boolean error = false; DefaultMutableTreeNode node; if (currentToken < tokens.size() && tokens.get(currentToken).getToken().equals("INTEGER")) { node = new DefaultMutableTreeNode("integer" + "(" + tokens.get(currentToken).getWord() + ")"); parent.add(node); SemanticAnalyzer.pushStack("int"); CodeGenerator.addInstruction("LIT", tokens.get(currentToken).getWord(), "0"); currentToken++; } else if (currentToken < tokens.size() && tokens.get(currentToken).getToken().equals("OCTAL")) { node = new DefaultMutableTreeNode("octal" + "(" + tokens.get(currentToken).getWord() + ")"); parent.add(node); SemanticAnalyzer.pushStack("int"); CodeGenerator.addInstruction("LIT", tokens.get(currentToken).getWord(), "0"); currentToken++; } else if (currentToken < tokens.size() && tokens.get(currentToken).getToken().equals("HEXADECIMAL")) { node = new DefaultMutableTreeNode( "hexadecimal" + "(" + tokens.get(currentToken).getWord() + ")"); parent.add(node); SemanticAnalyzer.pushStack("int"); CodeGenerator.addInstruction("LIT", tokens.get(currentToken).getWord(), "0"); currentToken++; } else if (currentToken < tokens.size() && tokens.get(currentToken).getToken().equals("BINARY")) { node = new DefaultMutableTreeNode("binary" + "(" + tokens.get(currentToken).getWord() + ")"); parent.add(node); SemanticAnalyzer.pushStack("int"); CodeGenerator.addInstruction("LIT", tokens.get(currentToken).getWord(), "0"); currentToken++; } else if (currentToken < tokens.size() && tokens.get(currentToken).getToken().equals("STRING")) { node = new DefaultMutableTreeNode("string" + "(" + tokens.get(currentToken).getWord() + ")"); parent.add(node); SemanticAnalyzer.pushStack("string"); CodeGenerator.addInstruction("LIT", tokens.get(currentToken).getWord(), "0"); currentToken++; } else if (currentToken < tokens.size() && tokens.get(currentToken).getToken().equals("CHARACTER")) { node = new DefaultMutableTreeNode("character" + "(" + tokens.get(currentToken).getWord() + ")"); parent.add(node); SemanticAnalyzer.pushStack("char"); CodeGenerator.addInstruction("LIT", tokens.get(currentToken).getWord(), "0"); currentToken++; } else if (currentToken < tokens.size() && tokens.get(currentToken).getToken().equals("FLOAT")) { node = new DefaultMutableTreeNode("float" + "(" + tokens.get(currentToken).getWord() + ")"); parent.add(node); SemanticAnalyzer.pushStack("float"); CodeGenerator.addInstruction("LIT", tokens.get(currentToken).getWord(), "0"); currentToken++; } else if (currentToken < tokens.size() && tokens.get(currentToken).getWord().equalsIgnoreCase("true")) { node = new DefaultMutableTreeNode("boolean" + "(" + tokens.get(currentToken).getWord() + ")"); parent.add(node); SemanticAnalyzer.pushStack("boolean"); CodeGenerator.addInstruction("LIT", tokens.get(currentToken).getWord(), "0"); currentToken++; } else if (currentToken < tokens.size() && tokens.get(currentToken).getWord().equals("false")) { node = new DefaultMutableTreeNode("boolean" + "(" + tokens.get(currentToken).getWord() + ")"); parent.add(node); SemanticAnalyzer.pushStack("boolean"); CodeGenerator.addInstruction("LIT", tokens.get(currentToken).getWord(), "0"); currentToken++; } else if (currentToken < tokens.size() && tokens.get(currentToken).getToken().equals("IDENTIFIER")) { node = new DefaultMutableTreeNode("identifier" + "(" + tokens.get(currentToken).getWord() + ")"); parent.add(node); if (SemanticAnalyzer.getSymbolTable().get(tokens.get(currentToken).getWord()) != null) SemanticAnalyzer.pushStack( SemanticAnalyzer.getSymbolTable() .get(tokens.get(currentToken).getWord()) .firstElement() .getType()); else { SemanticAnalyzer.error(getgui(), 0, getlineno(), tokens.get(currentToken).getWord()); SemanticAnalyzer.pushStack("ERROR"); } CodeGenerator.addInstruction("LOD", tokens.get(currentToken).getWord(), "0"); currentToken++; } else if (currentToken < tokens.size() && tokens.get(currentToken).getWord().equals("(")) { node = new DefaultMutableTreeNode("("); parent.add(node); currentToken++; // node = new DefaultMutableTreeNode("expression"); parent.add(node); error = rule_expression(node); // if (currentToken < tokens.size() && tokens.get(currentToken).getWord().equals(")")) { node = new DefaultMutableTreeNode(")"); parent.add(node); currentToken++; } else error(7); } else { error(9); } return false; }