I have been working on this for days and it's the most annoying error. For some reason, everything works correctly the first time through, as you can see from the sample output. However, if you go through a second time (as the input is from the command line, i.e. if you enter one command, hit enter, then enter another one), it messes up. The first number to be interpreted always appears to be 0. However, I realized this is because for some reason in my bufferString, I believe the first character is a newline character. If you look at my output of the bufferString, there is obviously a newline before what is the correct number.
Also, the val function is returning an error after the first pass at location 1 in the string, which would be the first character(what I'm thinking is the new line character).
program interpreter(input, output);
type
stackPointer = ^tStack;
tStack = record
elem : real;
nextRecord: stackPointer
end;
var
readIn: char;
bufferString: string;
top, next: real;
ready, endOfLine: boolean;
currElement: stackPointer;
errorMessage: integer;
procedure push;
var temp:stackPointer;
begin
new(temp);
temp^.nextRecord:=currElement;
temp^.elem:=next;
currElement:=temp;
end;
procedure pop;
var temp:stackPointer;
begin
temp:=currElement;
currElement:=currElement^.nextRecord;
top:=temp^.elem;
dispose(temp);
end;
procedure plus1;
var
sum: real;
begin
sum:=top+next;
writeln(top, ' + ', next, ' = ', sum);
next:=sum;
end;
procedure minus;
var
difference: real;
begin
difference:=top-next;
writeln(top, ' - ', next, ' = ', difference);
next:=difference;
end;
procedure multiply;
var
product: real;
begin
product:=top * next;
writeln(top, ' * ', next, ' = ', product);
next:=product;
end;
procedure divide;
var
quotient: real;
begin
quotient:= top / next;
writeln(top, ' / ', next, ' = ', quotient);
next:=quotient;
end;
begin
bufferString:='';
endOfLine:=false;
while not eof(input) do
begin
writeln('bufferString before1:', bufferString,'\');
read(readIn);
if (readIn = ' ') or eoln(input) or eof(input) then
begin
writeln('readIn=',readIn,';)');
if eoln(input) then
begin
writeln('What');
bufferString := readIn;
read(readIn);
endOfLine:=true;
end;
if bufferString='+' then
begin
writeln('+');
pop;
plus1;
end
else if bufferString='-' then
begin
writeln('-');
pop;
minus;
end
else if bufferString='*' then
begin
writeln('*');
pop;
multiply;
end
else if bufferString='/' then
begin
writeln('/');
pop;
divide;
end
else
begin
push;
val(bufferString, next, errorCode);
end;
bufferString:='';
end
else
begin
bufferString:= bufferString + readIn;
end;
if endOfLine=true then
begin
writeln('Answer = ', next);
endOfLine:=false;
end
end;
end.
input:
1 2 +
bufferString before1:\
bufferString before1:1\
readIn= ;)
bufferString before1:\
bufferString before1:2\
readIn= ;)
bufferString before1:\
readIn=+;)
What
+
1.000000000000000E+000 + 2.000000000000000E+000 = 3.000000000000000E+000
Answer = 3.000000000000000E+000
bufferString before1:\
then it gives me a prompt, so I input:
2 3 +
output:
3 4 +
bufferString before1:
\
bufferString before1:
2\
readIn= ;)
bufferString before1:\
bufferString before1:3\
readIn= ;)
bufferString before1:\
readIn=+;)
What
+
0.000000000000000E+000 + 3.000000000000000E+000 = 3.000000000000000E+000
Answer = 3.000000000000000E+000
bufferString before1:\
I hope one of you can help me as a professor is letting me redo this. I have tried so hard to get it to work and can't get any help on campus due to finals.