/// <summary>
        /// Translates a SPICE parse tree to a context.
        /// </summary>
        /// <param name="root">A parse tree root.</param>
        /// <returns>A netlist.</returns>
        public SpiceObject Evaluate(ParseTreeNode root)
        {
            if (root == null)
            {
                throw new ArgumentNullException(nameof(root));
            }

            var traversal = new ParseTreeTraversal();

            // Get tree nodes in post order
            var treeNodes = traversal.GetIterativePostOrder(root);

            // Iterate over tree nodes
            foreach (var treeNode in treeNodes)
            {
                if (treeNode is ParseTreeNonTerminalNode nt)
                {
                    var items = new ParseTreeNodeEvaluationValues(nt.LineNumber, nt.StartColumnIndex, nt.EndColumnIndex, nt.FileName);

                    foreach (var child in nt.Children)
                    {
                        items.Add(treeNodesValues[child]);
                    }

                    if (!evaluators.ContainsKey(nt.Name))
                    {
                        throw new ParseTreeEvaluationException("Unsupported evaluation of parse tree node: " + nt.Name);
                    }

                    var treeNodeResult = evaluators[nt.Name](items);
                    treeNodesValues[treeNode] = new ParseTreeNonTerminalEvaluationValue
                    {
                        SpiceObject = treeNodeResult,
                        Node        = treeNode,
                    };
                }
                else
                {
                    treeNodesValues[treeNode] = new ParseTreeNodeTerminalEvaluationValue()
                    {
                        Node  = treeNode,
                        Token = ((ParseTreeTerminalNode)treeNode).Token,
                    };
                }
            }

            if (treeNodesValues[root] is ParseTreeNonTerminalEvaluationValue rootNt)
            {
                return(rootNt.SpiceObject);
            }
            else
            {
                return(null);
            }
        }
Exemple #2
0
        // public static void process(UInt64 container)
        // public static void process(System.UInt64 container)
        public static void process(string filename)
        {
            // Test if this type is allowed.
            // StringBuilder sss;
            // StringBuilder sss = filename;

            csharpBuilder.helloFromCxx();

            String filetext = "";

            // Console.WriteLine ("In C# process(System.UInt64) called from ROSE C++: Hello!");

            Console.WriteLine(filename);

            using (FileStream fs = File.Open(filename, FileMode.Open))
            {
                byte[]       b    = new byte[1024];
                UTF8Encoding temp = new UTF8Encoding(true);

                while (fs.Read(b, 0, b.Length) > 0)
                {
                    // Console.WriteLine ("In C# process(string) reading file! \n");
                    // Console.WriteLine(temp.GetString(b));

                    // filetext += b;
                    filetext += temp.GetString(b);
                }
            }

            Console.WriteLine("In C# process(string) after reading file");

            // Output the file as text on the console (debugging).
            // Console.WriteLine (filetext);

            // SyntaxTree tree = CSharpSyntaxTree.ParseText("using System;");
            SyntaxTree tree = CSharpSyntaxTree.ParseText(filetext);

            Console.WriteLine("In C# process(System.UInt64) after parsing C# file");
            var compilation = CSharpCompilation.Create("MyCompilation", syntaxTrees: new[] { tree });

            SemanticModel model = compilation.GetSemanticModel(tree);

            Console.WriteLine("In C# process(System.UInt64) after compiling C# file");

            var root    = tree.GetRoot() as CSharpSyntaxNode;
            var builder = new AstBuilder(model);

            root.Accept(builder);
            csharpBuilder.basicFinalChecks();

#if IGNORE_NEW_CODE
            var collector = new UsingCollector();
            collector.Visit(root);

            foreach (var directive in collector.Usings)
            {
                Console.WriteLine(directive.Name);
            }
#endif

#if VERBOSE_MODE
            Console.WriteLine("In C# process(System.UInt64) after outputing the using directives!");
            Console.WriteLine("In C# process(System.UInt64) generate DOT file of Roslyn AST!");
#endif // VERBOSE_MODE

#if OUTPUT_DOT_GRAPH_OF_ABSTRACT_SYNTAX_TREE
            var buildDotGraph_object = new BuildDotGraph(filename);
            buildDotGraph_object.Visit(root);

            // Call the destructor.
            // buildDotGraph_object.Finalize();
            buildDotGraph_object.CloseOffDotSyntax();
#endif

#if VERBOSE_MODE
            Console.WriteLine("DONE: C# process(System.UInt64) generate DOT file of Roslyn AST!");
#endif // VERBOSE_MODE

#if OUTPUT_ABSTRACT_SYNTAX_TREE
            var abstractSyntaxTreeTraversal_object = new AbstractSyntaxTreeTraversal();
            abstractSyntaxTreeTraversal_object.Visit(root);
#endif

#if VERBOSE_MODE
            Console.WriteLine("In C# process(System.UInt64) output Roslyn AST!");
#endif // VERBOSE_MODE

#if OUTPUT_PARSE_TREE
            var parseTreeTraversal_object = new ParseTreeTraversal();
            parseTreeTraversal_object.Visit(root);
#endif

#if VERBOSE_MODE
            Console.WriteLine("In C# process(System.UInt64) after output of Roslyn AST!");

            Console.WriteLine("Leaving C# process(System.UInt64)");
#endif // VERBOSE_MODE
        }