(*****************************************************}
{}
{ * PROJECT:       BBB interpreter}
{}
{ * ORGANIZATION:  Microfluffy Corp.}
{}
{ * LANGUAGE:      Turbo Pascal}
{}
{ * FILE:          bbb.pas}
{}
{ * DESCRIPTION:   Main file. Global execution loop}
{}
{ * VERSION:       1.0}
{}
{ *****************************************************)



program Interpreter (Input, Output);



	uses
		Scan, SymTab, Parser;



	var

  { The main data structure for holding the program text }

		ProgBuf: array[1..MAX_PROG] of record


				LineNumber: integer;

				Line: LineStr;

			end;



		TotalLines: integer; { Total lines in the program }

		CurrentIndex: integer; { Index of the current line }



{ Reads in the program text file.  It first prompts for the filename,}
{}
{  then reads in the file. }

	procedure ReadProgText;

		var

			i: integer;

			InFileName: string;

			InFile: Text;

	begin {ReadProgText}

		i := 1;

		write('Enter BBB source code file name: ');

		readln(InFileName);

		reset(InFile, InFileName);


		while not eof(InFile) do
			begin

				read(InFile, ProgBuf[i].LineNumber);

				if ((ProgBuf[i].LineNumber < 1) or (ProgBuf[i].LineNumber > 32760)) then

					begin

						PrintError(e_badline, ProgBuf[i].LineNumber);

					end;

				readln(InFile, ProgBuf[i].Line);

				i := i + 1;

			end; {while}

		TotalLines := i - 1;

		close(InFile);

	end;  {ReadProgText}





{ Main Program }

	var

		i, NextLine: integer;



begin {program}

	InitScanner;

	InitSymtab;

	ReadProgText;



	CurrentIndex := 1;

	while (CurrentIndex <= TotalLines) do
		begin

			NextLine := ParseLine(ProgBuf[CurrentIndex].Line, ProgBuf[CurrentIndex].LineNumber);


			if (NextLine = NEXT_LINE) then

				CurrentIndex := CurrentIndex + 1

			else

				begin

					i := 1;

        { search for the line number being jumped to }

					while (ProgBuf[i].LineNumber <> NextLine) do

						i := i + 1;

					if (ProgBuf[i].LineNumber <> NextLine) then

						PrintError(e_badline, ProgBuf[CurrentIndex].LineNumber)

					else

						CurrentIndex := i;

				end;

		end; {while}
	writeln('Press any key to exit.');
	readln;

end. {program}

