120 lines
2.3 KiB
Text
120 lines
2.3 KiB
Text
global expr$ vars$[] vals[] stack[] .
|
|
#
|
|
func isop c$ .
|
|
return if strpos "&|!^" c$ > 0
|
|
.
|
|
func$ isvar c$ .
|
|
for i = 1 to len vars$[]
|
|
if vars$[i] = c$ : return 1
|
|
.
|
|
return 0
|
|
.
|
|
func varval c$ .
|
|
for i = 1 to len vars$[]
|
|
if vars$[i] = c$ : return vals[i]
|
|
.
|
|
return 0
|
|
.
|
|
proc push v .
|
|
stack[] &= v
|
|
.
|
|
func pop .
|
|
v = stack[$]
|
|
len stack[] (len stack[] - 1)
|
|
return v
|
|
.
|
|
func evalexpr .
|
|
len stack[] 0
|
|
for i = 1 to len expr$
|
|
c$ = substr expr$ i 1
|
|
if c$ = "T"
|
|
push 1
|
|
elif c$ = "F"
|
|
push 0
|
|
elif isvar c$ = 1
|
|
push varval c$
|
|
elif isop c$ = 1
|
|
a = pop
|
|
if c$ = "!"
|
|
push (1 - a)
|
|
elif c$ = "&"
|
|
b = pop
|
|
push (a * b)
|
|
elif c$ = "|"
|
|
b = pop
|
|
if a = 1 or b = 1 : push 1
|
|
if not (a = 1 or b = 1) : push 0
|
|
else
|
|
# ^
|
|
b = pop
|
|
push ((a + b) mod 2)
|
|
.
|
|
else
|
|
print "ERROR: syntax"
|
|
.
|
|
.
|
|
if len stack[] <> 1
|
|
print "ERROR: stack not single"
|
|
return 0
|
|
.
|
|
return stack[1]
|
|
.
|
|
proc setvars pos .
|
|
if pos > len vars$[]
|
|
line$ = ""
|
|
for i = 1 to len vars$[]
|
|
line$ &= substr "FT" (vals[i] + 1) 1 & " "
|
|
.
|
|
r = evalexpr
|
|
line$ &= substr "FT" (r + 1) 1
|
|
print line$
|
|
return
|
|
.
|
|
vals[pos] = 0
|
|
setvars pos + 1
|
|
vals[pos] = 1
|
|
setvars pos + 1
|
|
.
|
|
print "Enter postfix Boolean expressions."
|
|
print "Operators: & | ! ^"
|
|
print "Variables: single letters except T/F"
|
|
print "Empty line = exit"
|
|
repeat
|
|
write "\nBoolean expression: "
|
|
expr$ = input
|
|
until expr$ = ""
|
|
h$ = strjoin strtok expr$ " \t" ""
|
|
expr$ = ""
|
|
for c$ in strchars h$
|
|
c = strcode c$
|
|
if c >= 97 and c <= 122 : c$ = strchar (c - 32)
|
|
expr$ &= c$
|
|
.
|
|
vars$[] = [ ]
|
|
for i = 1 to len expr$
|
|
c$ = substr expr$ i 1
|
|
if isop c$ = 0
|
|
if c$ <> "T" and c$ <> "F" and isvar c$ = 0
|
|
vars$[] &= c$
|
|
.
|
|
.
|
|
.
|
|
if len vars$[] = 0
|
|
print "No variables; quitting."
|
|
break 1
|
|
.
|
|
len vals[] len vars$[]
|
|
head$ = ""
|
|
for i = 1 to len vars$[] : head$ &= vars$[i] & " "
|
|
head$ &= expr$
|
|
print ""
|
|
print head$
|
|
for i = 1 to len head$ : write "="
|
|
print ""
|
|
setvars 1
|
|
.
|
|
print ""
|
|
#
|
|
input_data
|
|
A B ^
|
|
A B C ^ |
|