dos_compilers/Digital Research PLI-86 v1/EXPR2.PLI
2024-06-30 12:01:25 -07:00

99 lines
2.6 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************/
/* This program evaluates an arithmetic expression */
/* using recursion. It contains an expanded version */
/* of the GNT procedure that obtains an expression */
/* containing separate tokens. EXP then recursively */
/* evaluates the tokens in the input line. */
/******************************************************/
expression:
procedure options(main);
%replace
true by '1'b;
declare
sysin file,
value float,
(token character(10), line character(80)) varying
static initial('');
on endfile(sysin)
stop;
on error(1) /* conversion or signal */
begin;
put skip list('Invalid Input at ',token);
token = ''; line = '';
goto restart;
end;
restart:
do while('1'b);
put skip(3) list('Type expression: ');
value = exp();
put edit('Value is: ',value) (skip,a,f(10,4));
end;
gnt:
procedure;
declare
i fixed;
line = substr(line,length(token)+1);
do while(true);
if line = '' then
get edit(line) (a);
i = verify(line,' ');
if i = 0 then
line = '';
else
do;
line = substr(line,i);
i = verify(line,'0123456789.');
if i = 0 then
token = line;
else
if i = 1 then
token = substr(line,1,1);
else
token = substr(line,1,i-1);
return;
end;
end;
end gnt;
exp:
procedure returns(float binary) recursive;
declare x float binary;
call gnt();
if token = '(' then
do;
x = exp();
call gnt();
if token = '+' then
x = x + exp();
else
if token = '-' then
x = x - exp();
else
if token = '*' then
x = x * exp();
else
if token = '/' then
x = x / exp();
else
signal error(1);
call gnt();
if token ^= ')' then
signal error(1);
end;
else
x = token;
return(x);
end exp;
end expression;