Ejemplo n.º 1
0
        public static List<Error> Translate(Source source)
        {
            var err = new List<Error>();
            var prg = new Program();
            try
            {
                var input = new ANTLRStringStream(source.GetSourceData());
                var lexer = new PascalLexer(input);
                var tokens = new CommonTokenStream(lexer);
                var parser = new PascalParser(tokens);
                prg = parser.program();
                prg.SetSourceIdentifier(source.GetSourceIdentifier());
            }
            catch (RecognitionException e)
            {
                err.Add(new Error(FormatRecognitionException(e, source.GetSourceIdentifier())));
            }
            if (err.Count != 0)
                return err;

            var val = new Validator();
            err = val.Validate(prg);
            Root = prg;
            return err;
        }
Ejemplo n.º 2
0
        static string TranslatePascalToCSharp(string pascal)
        {
            ICharStream  input        = new AntlrInputStream(pascal);
            PascalLexer  pascalLexer  = new PascalLexer(input);
            ITokenStream tokenStream  = new CommonTokenStream(pascalLexer);
            PascalParser pascalParser = new PascalParser(tokenStream)
            {
                ErrorHandler = new BailErrorStrategy()
            };

            var listener = new PascalParser.PascalListener();

            pascalParser.AddParseListener(listener);
            pascalParser.program();

            return(listener.Code);
        }
Ejemplo n.º 3
0
        public void ParseProgram()
        {
            // в качестве аргумента в функцию могу передавать только dottedNames

            const string input =
            @"
            program Hello;

            type a = record
              a : integer;
              b : B;
            end;

            type B = record
              a : integer;
            end;

            procedure print(a:integer);
            begin
            writeln(a);
            end;

            function sum(a:integer; b:integer):integer;
            var
             c : integer;
            begin
            c := a + b;
            sum := c;
            end;

            var
             c:a;
              d:integer;
            begin

              c.b.a := 5;
              d:=5;
              c.a := sum(c.b.a, d);
              for c=1 to c.a do
              begin
            print(c);
              end;

            end.
            ";

            lexer.CharStream = new ANTLRStringStream(input);
            tokens.TokenSource = lexer;
            parser = new PascalParser(tokens);
            var res = parser.program();
            Assert.AreEqual(res.GetChildren().Count, 7);
        }