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; }
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); }
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); }