private void FindSymbolsRecursively(ISyntaxNode node, ref int localVariableIndex) { if (node is BlockStatementNode) { var block = (BlockStatementNode)node; _scopeStack.PushAnonymousScope(); var declaredIdentifiers = block.Declarations.SelectMany(d => d.Variables).ToList(); EnterIdentifiers(declaredIdentifiers, SymbolTableEntryType.Variable, ref localVariableIndex); foreach (var statement in block.Statements) { FindSymbolsRecursively(statement, ref localVariableIndex); } _scopeStack.PopScope(); } else if (node is VariableReferenceNode) { var reference = (VariableReferenceNode)node; var symbolTableEntry = FindDeclaration(reference.Variable.Name); if (symbolTableEntry == null) { throw new Exception(string.Format("Variable {0} is not declared", reference.Variable.Name)); } reference.SymbolTableEntry = symbolTableEntry; } else if (node is AssignmentStatementNode) { var assign = (AssignmentStatementNode)node; var symbolTableEntry = FindDeclaration(assign.Variable.Name); if (symbolTableEntry == null) { throw new Exception(string.Format("Variable {0} is not declared", assign.Variable.Name)); } assign.SymbolTableEntry = symbolTableEntry; FindSymbolsRecursively(assign.Expression, ref localVariableIndex); } else if (node is FunctionCallNode) { var call = (FunctionCallNode)node; var symbolTableEntry = FindDeclaration(call.Name.Name); if (symbolTableEntry == null) { throw new Exception(string.Format("Function {0} is not declared", call.Name.Name)); } call.SymbolTableEntry = symbolTableEntry; foreach (var argument in call.Arguments) { FindSymbolsRecursively(argument, ref localVariableIndex); } } else { foreach (var child in node.GetChildren()) { FindSymbolsRecursively(child, ref localVariableIndex); } } }
private static void Print(ISyntaxNode node, int level) { Console.Write(new string(' ', 2 * level)); Console.WriteLine(node); foreach (var child in node.GetChildren()) { Print(child, level + 1); } }
private void FindSymbolsRecursively(ISyntaxNode node, ref int localVariableIndex) { if (node is BlockStatementNode) { var block = (BlockStatementNode) node; _scopeStack.PushAnonymousScope(); var declaredIdentifiers = block.Declarations.SelectMany(d => d.Variables).ToList(); EnterIdentifiers(declaredIdentifiers, SymbolTableEntryType.Variable, ref localVariableIndex); foreach (var statement in block.Statements) { FindSymbolsRecursively(statement, ref localVariableIndex); } _scopeStack.PopScope(); } else if (node is VariableReferenceNode) { var reference = (VariableReferenceNode) node; var symbolTableEntry = FindDeclaration(reference.Variable.Name); if (symbolTableEntry == null) throw new Exception(string.Format("Variable {0} is not declared", reference.Variable.Name)); reference.SymbolTableEntry = symbolTableEntry; } else if (node is AssignmentStatementNode) { var assign = (AssignmentStatementNode) node; var symbolTableEntry = FindDeclaration(assign.Variable.Name); if (symbolTableEntry == null) throw new Exception(string.Format("Variable {0} is not declared", assign.Variable.Name)); assign.SymbolTableEntry = symbolTableEntry; FindSymbolsRecursively(assign.Expression, ref localVariableIndex); } else if (node is FunctionCallNode) { var call = (FunctionCallNode) node; var symbolTableEntry = FindDeclaration(call.Name.Name); if (symbolTableEntry == null) throw new Exception(string.Format("Function {0} is not declared", call.Name.Name)); call.SymbolTableEntry = symbolTableEntry; foreach (var argument in call.Arguments) { FindSymbolsRecursively(argument, ref localVariableIndex); } } else { foreach (var child in node.GetChildren()) { FindSymbolsRecursively(child, ref localVariableIndex); } } }