Esempio n. 1
0
        public static void  doTreeAction(string f, ASTNode t, string[] tokenNames)
        {
            if (t == null)
            {
                return;
            }
            if (showTree)
            {
                BaseAST.setVerboseStringConversion(true, tokenNames);
                ASTNode r = (ASTNode) new ASTNodeFactory().create(0, "AST ROOT");
                r.setFirstChild(t);
                ASTFrame frame = new ASTFrame("C# AST for file [" + f + "]", r);
                frame.ShowDialog();
                //frame.Visible = true;
                // System.out.println(t.toStringList());
            }
            else if (printTree)
            {
                StringWriter        writer  = new StringWriter();
                CSharpPrettyPrinter printer = new CSharpPrettyPrinter();
                printer.setASTFactory(new ASTNodeFactory());
                CSharpParser.initializeASTFactory(printer.getASTFactory());

                long startTime = DateTime.Now.Ticks;
                printer.Print(writer, t, string.Empty);
                double elapsedTime = ((DateTime.Now.Ticks - startTime) / TimeSpan.TicksPerMillisecond) / 1000.0;
                System.Console.Out.WriteLine(writer.ToString());
                System.Console.Out.WriteLine("");
                System.Console.Out.WriteLine("");
                System.Console.Out.WriteLine("Pretty-printed {0} in: {1} seconds.", f, elapsedTime);
            }
        }
Esempio n. 2
0
        // Here's where we do the real work...
        public static void  parseFile(string f, Stream s)
        {
            try
            {
                // Define a selector that can switch from the C# codelexer to the C# preprocessor lexer
                TokenStreamSelector selector = new TokenStreamSelector();

                TokenStream lexer;
                // Create a scanner that reads from the input stream passed to us
                if (useFlexLexer)
                {
                    CSharpFlexLexer flexLexer = new CSharpFlexLexer(new StreamReader(s));
                    flexLexer.SetFileInfo(new FileInfo(f));
                    lexer = flexLexer;
                }
                else
                {
                    CSharpLexer antlrLexer = new CSharpLexer(new StreamReader(s));

                    antlrLexer.Selector = selector;
                    antlrLexer.setFilename(f);
                    CSharpPreprocessorLexer preproLexer = new CSharpPreprocessorLexer(antlrLexer.getInputState());
                    preproLexer.Selector = selector;
                    CSharpPreprocessorHooverLexer hooverLexer = new CSharpPreprocessorHooverLexer(antlrLexer.getInputState());
                    hooverLexer.Selector = selector;

                    // use the special token object class
                    antlrLexer.setTokenCreator(new CustomHiddenStreamToken.CustomHiddenStreamTokenCreator());
                    antlrLexer.setTabSize(1);
                    preproLexer.setTokenCreator(new CustomHiddenStreamToken.CustomHiddenStreamTokenCreator());
                    preproLexer.setTabSize(1);
                    hooverLexer.setTokenCreator(new CustomHiddenStreamToken.CustomHiddenStreamTokenCreator());
                    hooverLexer.setTabSize(1);

                    // notify selector about various lexers; name them for convenient reference later
                    selector.addInputStream(antlrLexer, "codeLexer");
                    selector.addInputStream(preproLexer, "directivesLexer");
                    selector.addInputStream(hooverLexer, "hooverLexer");
                    selector.select("codeLexer");                     // start with main the CSharp code lexer
                    lexer = selector;
                }

                // create the stream filter; hide WS and SL_COMMENT
                TokenStreamHiddenTokenFilter filter;                 // = new TokenStreamHiddenTokenFilter(lexer);
                if (displayTokens)
                {
                    filter = new TokenStreamHiddenTokenFilter(new LoggingTokenStream(lexer));
                }
                else
                {
                    filter = new TokenStreamHiddenTokenFilter(lexer);
                }

                filter.hide(CSharpTokenTypes.WHITESPACE);
                filter.hide(CSharpTokenTypes.NEWLINE);
                filter.hide(CSharpTokenTypes.ML_COMMENT);
                filter.hide(CSharpTokenTypes.SL_COMMENT);

                // Create a parser that reads from the scanner
                CSharpParser parser = new CSharpParser(filter);

                // create trees that copy hidden tokens into tree also
                parser.setASTNodeClass(typeof(ASTNode).FullName);
                parser.setASTFactory(new ASTNodeFactory());
                CSharpParser.initializeASTFactory(parser.getASTFactory());
                parser.setFilename(f);
                //parser.getASTFactory().setASTNodeCreator(new ASTNode.ASTNodeCreator());

                // start parsing at the compilationUnit rule
                long startTime = DateTime.Now.Ticks;
                parser.compilationUnit();
                double elapsedTime = ((DateTime.Now.Ticks - startTime) / TimeSpan.TicksPerMillisecond) / 1000.0;
                System.Console.Out.WriteLine("Parsed {0} in: {1} seconds.", f, elapsedTime);

                // do something with the tree
                Console.Error.WriteLine("       ... calling doTreeAction:");
                doTreeAction(f, (ASTNode)parser.getAST(), parser.getTokenNames());
            }
            catch (System.Exception e)
            {
                Console.Error.WriteLine("parser exception: " + e);
                Console.Error.WriteLine(e.StackTrace);                 // so we can get stack trace
            }
        }