Exemplo n.º 1
0
        /// <summary>
        /// 准备生成代码
        /// </summary>
        private IParseTree prepareForCodeGen()
        {
            errorPanel.Errors = null;
            textEditor.Errors = null;

            String input = textEditor.Text;

            if (String.IsNullOrEmpty(input))
            {
                return(null);
            }

            var listener = new CMMErrorListener();

            ICharStream  stream = CharStreams.fromstring(input);
            ITokenSource lexer  = new ExceptionLexer(stream, listener);
            ITokenStream tokens = new CommonTokenStream(lexer);
            CMMParser    parser = new CMMParser(tokens);

            parser.RemoveErrorListeners();

            parser.AddErrorListener(listener);
            parser.ErrorHandler = new CMMErrorStrategy();

            parser.BuildParseTree = true;
            IParseTree tree = parser.statements();

            //如果出错,转到错误面板并返回null
            if (listener.errors.Count != 0)
            {
                handleCompileTimeError(listener.errors);
                return(null);
            }
            var graph = new ParseTreeGrapher().CreateGraph(tree, CMMParser.ruleNames);

            drawTreePanel.Graph = graph;

            return(tree);
        }
Exemplo n.º 2
0
        // ReSharper disable once MethodTooLong
        private static void Main(string[] args)
        {
            try
            {
                LoadApplicationSettings();
                //Console.BackgroundColor = _Settings.EditorBackgroundColor;
                //Console.ForegroundColor = _Settings.EditorTextColor;
                //FillCurrentLineBackground();

                var parser       = new Parser(with => with.HelpWriter = null);
                var parserResult = parser.ParseArguments <Options>(args);
                parserResult
                .WithParsed(o =>
                {
                    var options       = Grammar.ParseOption.None;
                    var loadGui       = false;
                    var showParseTree = false;
                    var writeSvg      = false;
                    ISyntaxHighlightingGuide guide = null;

                    if (o.Tokens)
                    {
                        options |= Grammar.ParseOption.Tokens;
                    }
                    if (o.Diagnostics)
                    {
                        options |= Grammar.ParseOption.Diagnostics;
                    }
                    if (o.Trace)
                    {
                        options |= Grammar.ParseOption.Trace;
                    }
                    if (o.Tree)
                    {
                        options      |= Grammar.ParseOption.Tree;
                        showParseTree = true;
                    }

                    if (!string.IsNullOrEmpty(o.SvgFileName))
                    {
                        writeSvg = true;
                        options |= Grammar.ParseOption.Tree;
                    }

                    if (o.Sll)
                    {
                        options |= Grammar.ParseOption.Sll;
                    }
                    if (o.Gui)
                    {
                        loadGui  = true;
                        options |= Grammar.ParseOption.Tree;
                    }

                    var workingDirectory = Environment.CurrentDirectory;
                    var scanner          = new Grammar.Scanner();

                    var grammar = scanner.LocateGrammar(workingDirectory, o.GrammarName);
                    if (grammar == null)
                    {
                        Console.WriteLine(Resources.GrammarNotFoundErrorMessage, o.GrammarName);
                        return;
                    }

                    // To be used later once syntax highlighting for the console is enabled.
                    //var guideResult = grammar.LoadSyntaxHighlightingGuide();
                    //guide = guideResult != null ? guideResult.Item2 : new HeuristicSyntaxHighlightingGuide(_Settings);

                    string data;

                    if (!string.IsNullOrEmpty(o.FileName))
                    {
                        if (!File.Exists(o.FileName))
                        {
                            Console.WriteLine(Resources.FileNotFoundErrorMessage, o.FileName);
                            return;
                        }

                        var encodingToUse = !string.IsNullOrEmpty(o.EncodingName) ? Encoding.GetEncoding(o.EncodingName) : Encoding.Default;
                        using (var reader = new StreamReader(o.FileName, encodingToUse))
                            data = reader.ReadToEnd();
                    }
                    else
                    {
                        //var analyzer = new Analyzer();
                        var builder = new StringBuilder();
                        Console.WriteLine(Resources.ReadingFromStandardInputPromptMessage);
                        var currentLine = Console.CursorTop;
                        var keepReading = true;
                        while (keepReading)
                        {
                            if (Console.KeyAvailable)
                            {
                                while (Console.KeyAvailable)
                                {
                                    var typed = Console.ReadKey(true);

                                    if ((typed.Modifiers & ConsoleModifiers.Control) == ConsoleModifiers.Control &&
                                        typed.Key == ConsoleKey.Z)
                                    {
                                        Console.Write("^Z");
                                        keepReading = false;
                                        break;
                                    }

                                    if (typed.Key == ConsoleKey.Enter)
                                    {
                                        if (Console.CursorTop == Console.BufferHeight - 1)
                                        {
                                            _ScrollFadeCount++;
                                        }
                                        Console.WriteLine();
                                        FillCurrentLineBackground();
                                        builder.Append("\r\n");
                                    }
                                    else if (typed.Key == ConsoleKey.Tab)
                                    {
                                        var spaces = new string(' ', _Settings.EditorTabLength);
                                        Console.Write(spaces);
                                        builder.Append(spaces);
                                    }
                                    else if (typed.Key == ConsoleKey.Backspace)
                                    {
                                        if (Console.CursorLeft > 0)
                                        {
                                            Console.Write(typed.KeyChar);
                                            Console.Write(' ');
                                            Console.Write(typed.KeyChar);
                                            builder.Remove(builder.Length - 1, 1);
                                            _Cache.FlushTokensForLine(currentLine - (_ScrollFadeCount + 1));
                                        }
                                    }
                                    else
                                    {
                                        Console.Write(typed.KeyChar);
                                        builder.Append(typed.KeyChar);
                                    }
                                }

                                //analyzer.Tokenize(grammar, builder.ToString());
                                //HighlightSyntaxInConsole(currentLine - (_ScrollFadeCount + 1), analyzer, guide);
                            }
                        }

                        Console.WriteLine();
                        data = builder.ToString();
                    }

                    // If tokens are the only option we've received, we don't need to parse
                    if (options == Grammar.ParseOption.Tokens)
                    {
                        DisplayTokens(grammar, data);
                        return;
                    }

                    // Now we attempt to parse, but still handle a lexer-only grammar.
                    if (grammar.Parser != null)
                    {
                        var analyzer      = new Analyzer();
                        var grammarParser = analyzer.BuildParserWithOptions(grammar, data, options);
                        analyzer.ExecuteParsing(grammarParser, o.RuleName);

                        if (showParseTree)
                        {
                            Console.WriteLine(analyzer.ParserContext.ToStringTree(grammarParser));
                        }

                        if (writeSvg)
                        {
                            var rules   = scanner.GetParserRulesForGrammarParser(grammar.Parser);
                            var grapher = new ParseTreeGrapher()
                            {
                                BackgroundColor = _Settings.GraphNodeBackgroundColor.GetMsAglColor(),
                                BorderColor     = _Settings.GraphNodeBorderColor.GetMsAglColor(),
                                TextColor       = _Settings.GraphNodeTextColor.GetMsAglColor()
                            };
                            var graph = grapher.CreateGraph(analyzer.ParserContext, rules.ToList());
                            graph.LayoutAlgorithmSettings = new SugiyamaLayoutSettings();
                            GraphRenderer renderer        = new GraphRenderer(graph);
                            renderer.CalculateLayout();
                            graph.EscapeNodesForSvg();
                            SvgGraphWriter.Write(graph, o.SvgFileName, null, null, 4);
                        }
                    }
                    else
                    {
                        if (options.HasFlag(ParseOption.Tokens))
                        {
                            DisplayTokens(grammar, data);
                        }

                        if (showParseTree || writeSvg)
                        {
                            Console.WriteLine(Resources.GrammarHasNoParserErrorMessage, grammar.GrammarName);
                        }
                        if (showParseTree)
                        {
                            Console.WriteLine(Resources.UnableToDisplayParseTree);
                        }
                        if (writeSvg)
                        {
                            Console.WriteLine(Resources.SvgWritingAbortedErrorMessage);
                        }
                    }

                    if (loadGui)
                    {
                        LoadGui(data, grammar, o.RuleName);
                    }
                })
                .WithNotParsed(errs => DisplayHelp(parserResult, errs));

#if DEBUG
                Console.WriteLine(Resources.PressAnyKeyMessage);
                Console.ReadKey();
#endif
            }
            // ReSharper disable once CatchAllClause
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
#if DEBUG
                Console.WriteLine(Resources.PressAnyKeyMessage);
                Console.ReadKey();
#endif
            }
        }