private SymbolTable handleRoutineBody(AstNode node, SymbolTable table) { List <AstNode> childes = node.getChilds(); foreach (var j in childes) { if (j.GetNodeType().Equals(AstNode.NodeType.Constant)) { List <AstNode> consts = j.getChilds(); foreach (var constant in consts) { AstNode id = constant.getChilds()[0]; SymbolTableEntry entry = new SymbolTableEntry(id); entry.type = "int"; entry.isConst = true; entry.isInitialized = true; table.Add(((Token)id.getValue()).GetValue(), entry); return(table); } } else if (j.GetNodeType().Equals(AstNode.NodeType.Variable)) { var childs = j.getChilds(); var type = ((Token)childs[0].getValue()).GetValue(); for (var i = 1; i < childs.Count; i++) { var id = childs[i].getChilds()[0]; var entry = new SymbolTableEntry(id); entry.type = type; if (childs.Count > 1 && childs[1].GetNodeType().Equals(AstNode.NodeType.Expression)) { entry.isInitialized = true; } table.Add(((Token)id.getValue()).GetValue(), entry); } return(table); } else { SymbolTable newTable = handleRoutineBody(j, table); foreach (var t in newTable.Values) { table.Add(t.name, t); } return(table); } } return(new SymbolTable()); }
private string handleParameters(AstNode parameter, RoutineTableEntry entry) { string type = ((Token)parameter.getValue()).GetValue(); string name = ((Token)parameter.getChilds()[0].getValue()).GetValue(); checkSymbol(name); SymbolTableEntry symbolTableEntry = new SymbolTableEntry(parameter.getChilds()[0]); symbolTableEntry.type = type; symbols.Add(name, symbolTableEntry); return(type); }
private void handleSymbol(AstNode node) { var entry = new SymbolTableEntry(node, maxVarId++); symbols.Add(entry.name, entry); }