private TTokenCode token; // code of current token #endregion Fields #region Constructors public StagingParser(TextBuffer buffer, IntermediateCode icode, SymtabStack symbolStack) { this.buffer = buffer; this.icode = icode; this.symtabStack = symbolStack; pScanner = new TextScanner(this.buffer); // -- Enter the special "input" and "output" variable identifiers // -- into the symbol table. EnterLocal("input"); EnterLocal("output"); }
static void Main(string[] args) { // string source = @" //PROGRAM fibonacci (output); // //VAR // number : integer; // //FUNCTION fib (n : integer) : integer; // // BEGIN // IF n <= 1 THEN fib := n // ELSE fib := fib(n - 2) + fib(n - 1) // END; // //BEGIN // FOR number:= 0 TO 16 DO BEGIN // writeln('number = ', number:2, // ' fibonacci = ', fib(number):4); // END; //END."; string simpleSource = @"identifier := 123; somestring := 'abc'; updatevalue := identifier + 5; output := updatevalue ."; string testNewtons = @"{Square roots by Newton's algorithm.} number := input; root := number; root := (number/root + root)/2; output := root; root := (number/root + root)/2; output := root; root := (number/root + root)/2; output := root; root := (number/root + root)/2; output := root; root := (number/root + root)/2; output := root; root := (number/root + root)/2; output := root; root := (number/root + root)/2; output := root; root := (number/root + root)/2; output := root; root := (number/root + root)/2; output := root; ."; string source; using (StreamReader reader = new StreamReader(File.OpenRead("source.pas"))) { source = reader.ReadToEnd(); } SharedProperties.globalSymtab = Symtab.CreateTable(); TextBuffer buffer = new TextBuffer(File.OpenRead("source.pas")); IntermediateCode icode = new IntermediateCode(); SymtabStack symbolTableStack = new SymtabStack(SharedProperties.globalSymtab); StagingParser parser = new StagingParser(buffer, icode, symbolTableStack); parser.Error += new EventHandler<ErrorEventArgs>(parser_Error); parser.Parse(); Console.WriteLine(); // -- print the parsers summary string message = string.Format("{0} source lines", buffer.LineNumber - 1); int spaceCount = (Console.WindowWidth - message.Length) / 2; Console.WriteLine(string.Format("{0," + spaceCount + "}", message)); message = string.Format("{0} syntax errors.", buffer.ErrorCount); spaceCount = (Console.WindowWidth - message.Length) / 2; Console.WriteLine(string.Format("{0," + spaceCount + "}", message)); Console.WriteLine(); TExecutor executer = new TExecutor(icode); executer.Error += new EventHandler<RuntimeErrorArgs>(executer_Error); executer.Go(); if (executer.ErrorCount > 0) { Console.WriteLine("Successful completion. {0} statements executed.", executer.StatementCount); } else { Console.WriteLine("Completed with {0} errors.", executer.ErrorCount); } Console.ReadKey(); }
public TextScanner(TextBuffer buffer) { this.buffer = buffer; }