public SemanticAnalyzer() { symbolTable = new SymbolTable(); procedureTable = new ProcedureTable(); procedureTable["WrInt"] = new ProcedureTable.Row(Type.VOID, true); procedureTable["WrInt"].symbols["i"] = new SymbolTable.Row(Type.INT, Kind.PARAM, 0); procedureTable["WrStr"] = new ProcedureTable.Row(Type.VOID, true); procedureTable["WrStr"].symbols["s"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, 0); procedureTable["WrBool"] = new ProcedureTable.Row(Type.VOID, true); procedureTable["WrBool"].symbols["b"] = new SymbolTable.Row(Type.BOOL, Kind.PARAM, 0); procedureTable["WrLn"] = new ProcedureTable.Row(Type.VOID, true); procedureTable["RdInt"] = new ProcedureTable.Row(Type.INT, true); procedureTable["RdStr"] = new ProcedureTable.Row(Type.STRING, true); procedureTable["AtStr"] = new ProcedureTable.Row(Type.STRING, true); procedureTable["AtStr"].symbols["s"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 0); procedureTable["AtStr"].symbols["i"] = new SymbolTable.Row(Type.INT, Kind.PARAM, pos: 1); procedureTable["LenStr"] = new ProcedureTable.Row(Type.INT, true); procedureTable["LenStr"].symbols["s"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 0); procedureTable["CmpStr"] = new ProcedureTable.Row(Type.INT, true); procedureTable["CmpStr"].symbols["s1"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 0); procedureTable["CmpStr"].symbols["s2"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 1); procedureTable["CatStr"] = new ProcedureTable.Row(Type.STRING, true); procedureTable["CatStr"].symbols["s1"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 0); procedureTable["CatStr"].symbols["s2"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 1); procedureTable["LenLstInt"] = new ProcedureTable.Row(Type.INT, true); procedureTable["LenLstInt"].symbols["loi"] = new SymbolTable.Row(Type.INT_LIST, Kind.PARAM, pos: 0); procedureTable["LenLstStr"] = new ProcedureTable.Row(Type.INT, true); procedureTable["LenLstStr"].symbols["los"] = new SymbolTable.Row(Type.STRING_LIST, Kind.PARAM, pos: 0); procedureTable["LenLstBool"] = new ProcedureTable.Row(Type.INT, true); procedureTable["LenLstBool"].symbols["lob"] = new SymbolTable.Row(Type.BOOL_LIST, Kind.PARAM, pos: 0); procedureTable["NewLstInt"] = new ProcedureTable.Row(Type.INT_LIST, true); procedureTable["NewLstInt"].symbols["size"] = new SymbolTable.Row(Type.INT, Kind.PARAM, pos: 0); procedureTable["NewLstStr"] = new ProcedureTable.Row(Type.STRING_LIST, true); procedureTable["NewLstStr"].symbols["size"] = new SymbolTable.Row(Type.INT, Kind.PARAM, pos: 0); procedureTable["NewLstBool"] = new ProcedureTable.Row(Type.BOOL_LIST, true); procedureTable["NewLstBool"].symbols["size"] = new SymbolTable.Row(Type.INT, Kind.PARAM, pos: 0); procedureTable["IntToStr"] = new ProcedureTable.Row(Type.STRING, true); procedureTable["IntToStr"].symbols["i"] = new SymbolTable.Row(Type.INT, Kind.PARAM, pos: 0); procedureTable["StrToInt"] = new ProcedureTable.Row(Type.INT, true); procedureTable["StrToInt"].symbols["s"] = new SymbolTable.Row(Type.STRING, Kind.PARAM, pos: 0); }
public Type Visit(ProcedureDeclarationNode node) { var procedureName = node.AnchorToken.Lexeme; if (procedureTable.Contains(procedureName)) { throw new SemanticError($"Duplicate procedure {procedureName}", node.AnchorToken); } Type procedureType = Visit((dynamic)node[1]); procedureTable[procedureName] = new ProcedureTable.Row(procedureType, false); currentScope = procedureName; Visit((dynamic)node[0]); VisitChildren(node, 2); currentScope = ""; return(procedureType); }