Example #1
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("参数:要进行分析的源代码路径");
                Console.WriteLine("分析结果会通过标准IO输出");
                Console.WriteLine();
                Console.WriteLine("使用例子:");
                Console.WriteLine("dotnet run -- /path/to/your/file");
                Console.WriteLine();
                Console.WriteLine("假如您想要输出到文件,请使用IO重定向功能,例如:");
                Console.WriteLine("dotnet run -- /path/to/your/file >output.txt 2>&1");
                Console.WriteLine();
                return;
            }

            var path = args[0];

            try
            {
                var buffer = File.ReadAllText(path);

                var res   = Ex1Tokenizer.TokenizeBuffer(buffer);
                var fixer = new LineNumberFixer(buffer);

                res.Match(
                    Right: r => PrintRight(r, fixer),
                    Left: l => PrintLeft(l, fixer)
                    );
            }
            catch (FileNotFoundException)
            {
                Console.Error.WriteLine($"文件 {path} 不存在");
            }
        }
        public LineNumberFixer_Test()
        {
            // 最后一行可能没有换行符
            const string buffer = "123\n456\nffffffff";

#if DEBUG
            buffer.Length.ShouldBe(16);
#endif

            _lineNumberFixer = new LineNumberFixer(buffer);
        }
Example #3
0
        private static void PrintRight(IEnumerable <Token> tokens, LineNumberFixer fixer)
        {
            foreach (var token in tokens)
            {
                var beginPosition = fixer.GetPosition(token.TokenBeginIdx).TidyPosition();
                var endPosition   = fixer.GetPosition(token.TokenEndIdx).TidyPosition();

                Console.WriteLine($"类型:“{token.TokenType}”\n词素:“{token.Lexeme}”\n" +
                                  $"起始位置:{beginPosition}\n终止位置:{endPosition}\n");
            }
        }
Example #4
0
        private static void HandleRight(IEnumerable <Token> tokens, LineNumberFixer fixer)
        {
            var(application, parseExceptions) = Parser.Parse(tokens.ToList());

            if (parseExceptions.Any())
            {
                HandleParseError(parseExceptions, fixer);
                Console.WriteLine("源代码含有语法错误,本程序只生成了部分的ast:");
            }

            HandleAst(application);
        }
Example #5
0
        private static void PrintLeft(IEnumerable <WrongTokenException> exceptions, LineNumberFixer fixer)
        {
            Console.Error.WriteLine("无法识别的语法单元:");
            Console.Error.WriteLine();

            foreach (var exception in exceptions)
            {
                var beginPosition = fixer.GetPosition(exception.TokenBegin);
                var endPosition   = fixer.GetPosition(exception.CurrentIdx);
#if DEBUG
                beginPosition.line.ShouldBe(endPosition.line);
#endif
                Console.Error.WriteLine($"在 {endPosition.TidyPosition()} 处:");
                Console.Error.WriteLine();
                Console.Error.WriteLine(fixer.GetPositionRangeMap(beginPosition.line, beginPosition.column, endPosition.column));
                Console.Error.WriteLine();
            }
        }
Example #6
0
        private static void HandleParseError(ICollection <ParseException> parseExceptions, LineNumberFixer fixer)
        {
            Console.Error.WriteLine("语法错误:");
            Console.Error.WriteLine();

            foreach (var exception in parseExceptions)
            {
                Console.Error.WriteLine(exception.Message);
                if (exception.Token != null)
                {
                    var beginPosition = fixer.GetPosition(exception.Token.TokenBeginIdx);
                    var endPosition   = fixer.GetPosition(exception.Token.TokenEndIdx);
#if DEBUG
                    beginPosition.line.ShouldBe(endPosition.line);
#endif
                    Console.Error.WriteLine($"在 {beginPosition.TidyPosition()}-{endPosition.TidyPosition()} 处:");
                    Console.Error.WriteLine();
                    Console.Error.WriteLine(fixer.GetPositionRangeMap(beginPosition.line, beginPosition.column,
                                                                      endPosition.column));
                }

                Console.Error.WriteLine();
            }
        }