示例#1
0
 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);
         }
     }
 }
示例#2
0
 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);
     }
 }
示例#3
0
 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);
     }
 }
示例#4
0
 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);
         }
     }
 }