Data update
This commit is contained in:
parent
4bb20c9b71
commit
cbaf4c4b64
12390 changed files with 318560 additions and 27248 deletions
|
|
@ -1,4 +1,4 @@
|
|||
A [[wp:Truth table|truth table]] is a display of the inputs to, and the output of a Boolean function organized as a table where each row gives one combination of input values and the corresponding value of the function.
|
||||
A [[wp:Truth rtable|truth table]] is a display of the inputs to, and the output of a Boolean function organized as a table where each row gives one combination of input values and the corresponding value of the function.
|
||||
|
||||
|
||||
;Task:
|
||||
|
|
|
|||
86
Task/Truth-table/Crystal/truth-table.cr
Normal file
86
Task/Truth-table/Crystal/truth-table.cr
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
record Op, name : Char, prio : Int32, assoc : Symbol, arity : Int32, eval : Bs -> Bool
|
||||
|
||||
def op (name, prio, assoc, arity, eval)
|
||||
Op.new name, prio, assoc, arity, eval
|
||||
end
|
||||
|
||||
alias Bs = Array(Bool)
|
||||
|
||||
OPS = {
|
||||
'T' => op('T', 1, :left, 0, ->(p : Bs) { true }),
|
||||
'F' => op('F', 1, :left, 0, ->(p : Bs) { false }),
|
||||
'~' => op('~', 2, :right, 1, ->(p : Bs) { !p[0] }),
|
||||
'&' => op('&', 3, :left, 2, ->(p : Bs) { p[0] && p[1] }),
|
||||
'|' => op('|', 4, :left, 2, ->(p : Bs) { p[0] || p[1] }),
|
||||
'^' => op('^', 4, :left, 2, ->(p : Bs) { p[0] != p[1] }),
|
||||
'>' => op('>', 5, :left, 2, ->(p : Bs) { !p[0] || p[1] }),
|
||||
'=' => op('=', 6, :left, 2, ->(p : Bs) { p[0] == p[1] }),
|
||||
}
|
||||
|
||||
def to_rpn (string)
|
||||
tokens = string.delete(' ').chars
|
||||
output = [] of Char | Op
|
||||
opstack = [] of Op
|
||||
mark = op('x', -1, :none, 0, ->(p : Bs) { raise "?" })
|
||||
|
||||
tokens.each do |token|
|
||||
if token == '('
|
||||
opstack << mark
|
||||
elsif token == ')'
|
||||
while opstack.present? && opstack.last != mark
|
||||
output << opstack.pop
|
||||
end
|
||||
opstack.pop
|
||||
elsif opdata = OPS[token]?
|
||||
while opstack.present? && OPS.has_key?(opstack.last.name) &&
|
||||
(opdata.prio > opstack.last.prio ||
|
||||
opdata.prio == opstack.last.prio && opdata.assoc == :left)
|
||||
output << opstack.pop
|
||||
end
|
||||
opstack << opdata
|
||||
else
|
||||
raise "unknown symbol #{token}" unless token.letter?
|
||||
output << token.downcase
|
||||
end
|
||||
end
|
||||
while opstack.present?
|
||||
output << opstack.pop
|
||||
end
|
||||
output
|
||||
end
|
||||
|
||||
def eval (expr)
|
||||
stack = [] of Bool
|
||||
expr.each do |op|
|
||||
if op.is_a? Op
|
||||
params = stack.pop(op.arity)
|
||||
stack.push op.eval[params]
|
||||
else
|
||||
stack.push op
|
||||
end
|
||||
end
|
||||
stack.pop
|
||||
end
|
||||
|
||||
puts <<-EOT
|
||||
Enter Boolean expressions. Operators are:
|
||||
= (eqv), > (impl), & (and), | (or), ^ (xor), ~ (not)
|
||||
Constants are: T (true), F (false) (case is important!)
|
||||
Variables are any letter (case isn't important, except for f and t)
|
||||
EOT
|
||||
|
||||
loop do
|
||||
print "expression> "
|
||||
s = gets
|
||||
break if s.nil? || s == ""
|
||||
stack = to_rpn(s)
|
||||
vars = stack.select(Char).uniq.sort
|
||||
puts vars.join(" ") + " | " + s
|
||||
puts "--" * vars.size + "+-" + "-" * s.size
|
||||
Indexable.each_cartesian([[true, false]] * vars.size) do |bools|
|
||||
print bools.map(&.to_s[0].upcase).join(" ")
|
||||
vals = Hash.zip(vars, bools)
|
||||
result = eval stack.map {|elt| elt.is_a?(Char) ? vals[elt] : elt }
|
||||
puts " | #{result.to_s[0].upcase}"
|
||||
end
|
||||
end
|
||||
120
Task/Truth-table/EasyLang/truth-table.easy
Normal file
120
Task/Truth-table/EasyLang/truth-table.easy
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
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 ^ |
|
||||
|
|
@ -1,188 +1,186 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
|
||||
<span style="color: #008080;">constant</span> <span style="color: #000000;">bFT</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span> <span style="color: #000080;font-style:italic;">-- true: use F/T, false: use 0/1, as next</span>
|
||||
with javascript_semantics
|
||||
constant bFT = false -- true: use F/T, false: use 0/1, as next
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">fmt</span><span style="color: #0000FF;">(</span><span style="color: #004080;">bool</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">bFT</span><span style="color: #0000FF;">?{</span><span style="color: #008000;">"F"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"T"</span><span style="color: #0000FF;">}:{</span><span style="color: #008000;">"0"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"1"</span><span style="color: #0000FF;">})[</span><span style="color: #000000;">b</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
function fmt(bool b)
|
||||
return iff(bFT?{"F","T"}:{"0","1"})[b+1]
|
||||
end function
|
||||
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">opstack</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
|
||||
<span style="color: #004080;">object</span> <span style="color: #000000;">token</span><span style="color: #0000FF;">,</span>
|
||||
<span style="color: #000000;">op</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #000080;font-style:italic;">-- 0 = none</span>
|
||||
<span style="color: #004080;">string</span> <span style="color: #000000;">s</span> <span style="color: #000080;font-style:italic;">-- the expression being parsed</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">sidx</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- idx to ""</span>
|
||||
<span style="color: #000000;">ch</span> <span style="color: #000080;font-style:italic;">-- s[sidx]</span>
|
||||
sequence opstack = {}
|
||||
object token,
|
||||
op = 0 -- 0 = none
|
||||
string s -- the expression being parsed
|
||||
integer sidx, -- idx to ""
|
||||
ch -- s[sidx]
|
||||
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">err</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">msg</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n%s^ %s\n\nPressEnter..."</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sidx</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span><span style="color: #000000;">msg</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">wait_key</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #7060A8;">abort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
procedure err(string msg)
|
||||
printf(1,"%s\n%s^ %s\n\nPressEnter...",{s,repeat(' ',sidx-1),msg})
|
||||
{} = wait_key()
|
||||
abort(0)
|
||||
end procedure
|
||||
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">nxtch</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #000000;">sidx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #000000;">ch</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sidx</span><span style="color: #0000FF;">></span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)?-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">:</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sidx</span><span style="color: #0000FF;">])</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
procedure nxtch()
|
||||
sidx += 1
|
||||
ch = iff(sidx>length(s)?-1:s[sidx])
|
||||
end procedure
|
||||
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">skipspaces</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" \t\r\n"</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">do</span> <span style="color: #000000;">nxtch</span><span style="color: #0000FF;">()</span> <span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
procedure skipspaces()
|
||||
while find(ch," \t\r\n")!=0 do nxtch() end while
|
||||
end procedure
|
||||
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">get_token</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #000000;">skipspaces</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"()!"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">token</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sidx</span><span style="color: #0000FF;">..</span><span style="color: #000000;">sidx</span><span style="color: #0000FF;">]</span>
|
||||
<span style="color: #000000;">nxtch</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">else</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">tokstart</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sidx</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000000;">token</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"eof"</span> <span style="color: #008080;">return</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">nxtch</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;"><</span><span style="color: #008000;">'A'</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #000000;">token</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">tokstart</span><span style="color: #0000FF;">..</span><span style="color: #000000;">sidx</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
procedure get_token()
|
||||
skipspaces()
|
||||
if find(ch,"()!") then
|
||||
token = s[sidx..sidx]
|
||||
nxtch()
|
||||
else
|
||||
integer tokstart = sidx
|
||||
if ch=-1 then token = "eof" return end if
|
||||
while 1 do
|
||||
nxtch()
|
||||
if ch<'A' then exit end if
|
||||
end while
|
||||
token = s[tokstart..sidx-1]
|
||||
end if
|
||||
end procedure
|
||||
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">Match</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">token</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">t</span> <span style="color: #008080;">then</span> <span style="color: #000000;">err</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">&</span><span style="color: #008000;">" expected"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">get_token</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
procedure Match(string t)
|
||||
if token!=t then err(t&" expected") end if
|
||||
get_token()
|
||||
end procedure
|
||||
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">PopFactor</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #004080;">object</span> <span style="color: #000000;">p2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">opstack</span><span style="color: #0000FF;">[$]</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">op</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"not"</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">opstack</span><span style="color: #0000FF;">[$]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">op</span><span style="color: #0000FF;">,</span><span style="color: #000000;">p2</span><span style="color: #0000FF;">}</span>
|
||||
<span style="color: #008080;">else</span>
|
||||
<span style="color: #000000;">opstack</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">opstack</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
|
||||
<span style="color: #000000;">opstack</span><span style="color: #0000FF;">[$]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">opstack</span><span style="color: #0000FF;">[$],</span><span style="color: #000000;">op</span><span style="color: #0000FF;">,</span><span style="color: #000000;">p2</span><span style="color: #0000FF;">}</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">op</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
procedure PopFactor()
|
||||
object p2 = opstack[$]
|
||||
if op="not" then
|
||||
opstack[$] = {0,op,p2}
|
||||
else
|
||||
opstack = opstack[1..$-1]
|
||||
opstack[$] = {opstack[$],op,p2}
|
||||
end if
|
||||
op = 0
|
||||
end procedure
|
||||
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">names</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- {"false","true",...}</span>
|
||||
<span style="color: #000000;">flags</span> <span style="color: #000080;font-style:italic;">-- { 0, 1, ,...}</span>
|
||||
sequence names, -- {"false","true",...}
|
||||
flags -- { 0, 1, ,...}
|
||||
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">PushFactor</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">op</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #000000;">PopFactor</span><span style="color: #0000FF;">()</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span><span style="color: #000000;">names</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">names</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">names</span><span style="color: #0000FF;">,</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">names</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">opstack</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">opstack</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
procedure PushFactor(string t)
|
||||
if op!=0 then PopFactor() end if
|
||||
integer k = find(t,names)
|
||||
if k=0 then
|
||||
names = append(names,t)
|
||||
k = length(names)
|
||||
end if
|
||||
opstack = append(opstack,k)
|
||||
end procedure
|
||||
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">PushOp</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">op</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #000000;">PopFactor</span><span style="color: #0000FF;">()</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">op</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">t</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
procedure PushOp(string t)
|
||||
if op!=0 then PopFactor() end if
|
||||
op = t
|
||||
end procedure
|
||||
|
||||
<span style="color: #008080;">forward</span> <span style="color: #008080;">procedure</span> <span style="color: #000000;">Expr</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">)</span>
|
||||
forward procedure Expr(integer p)
|
||||
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">Factor</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">token</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"not"</span>
|
||||
<span style="color: #008080;">or</span> <span style="color: #000000;">token</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"!"</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">get_token</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #000000;">Factor</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">op</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #000000;">PopFactor</span><span style="color: #0000FF;">()</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">PushOp</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"not"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">token</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"("</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">get_token</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #000000;">Expr</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">Match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">")"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">elsif</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">token</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"and"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"or"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"xor"</span><span style="color: #0000FF;">})</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">PushFactor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">token</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">ch</span><span style="color: #0000FF;">!=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">get_token</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">else</span>
|
||||
<span style="color: #000000;">err</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"syntax error"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
procedure Factor()
|
||||
if token="not"
|
||||
or token="!" then
|
||||
get_token()
|
||||
Factor()
|
||||
if op!=0 then PopFactor() end if
|
||||
PushOp("not")
|
||||
elsif token="(" then
|
||||
get_token()
|
||||
Expr(0)
|
||||
Match(")")
|
||||
elsif not find(token,{"and","or","xor"}) then
|
||||
PushFactor(token)
|
||||
if ch!=-1 then
|
||||
get_token()
|
||||
end if
|
||||
else
|
||||
err("syntax error")
|
||||
end if
|
||||
end procedure
|
||||
|
||||
<span style="color: #008080;">constant</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">operators</span><span style="color: #0000FF;">,</span>
|
||||
<span style="color: #000000;">precedence</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">columnize</span><span style="color: #0000FF;">({{</span><span style="color: #008000;">"not"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">},</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #008000;">"and"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">},</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #008000;">"xor"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">},</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #008000;">"or"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">}})</span>
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">Expr</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">Factor</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">token</span><span style="color: #0000FF;">,</span><span style="color: #000000;">operators</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">thisp</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">precedence</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">thisp</span><span style="color: #0000FF;"><</span><span style="color: #000000;">p</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">get_token</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #000000;">Expr</span><span style="color: #0000FF;">(</span><span style="color: #000000;">thisp</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">PushOp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">operators</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">])</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
constant {operators,
|
||||
precedence} = columnize({{"not",6},
|
||||
{"and",5},
|
||||
{"xor",4},
|
||||
{"or",3}})
|
||||
procedure Expr(integer p)
|
||||
Factor()
|
||||
while 1 do
|
||||
integer k = find(token,operators)
|
||||
if k=0 then exit end if
|
||||
integer thisp = precedence[k]
|
||||
if thisp<p then exit end if
|
||||
get_token()
|
||||
Expr(thisp)
|
||||
PushOp(operators[k])
|
||||
end while
|
||||
end procedure
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">evaluate</span><span style="color: #0000FF;">(</span><span style="color: #004080;">object</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #004080;">atom</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">flags</span><span style="color: #0000FF;">[</span><span style="color: #000000;">s</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">s</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #004080;">object</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">lhs</span><span style="color: #0000FF;">,</span><span style="color: #000000;">op</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rhs</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span>
|
||||
<span style="color: #000000;">lhs</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">evaluate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lhs</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">rhs</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">evaluate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rhs</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">op</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"and"</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">lhs</span> <span style="color: #008080;">and</span> <span style="color: #000000;">rhs</span>
|
||||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">op</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"or"</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">lhs</span> <span style="color: #008080;">or</span> <span style="color: #000000;">rhs</span>
|
||||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">op</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"xor"</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">lhs</span> <span style="color: #008080;">xor</span> <span style="color: #000000;">rhs</span>
|
||||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">op</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"not"</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #008080;">not</span> <span style="color: #000000;">rhs</span>
|
||||
<span style="color: #008080;">else</span>
|
||||
<span style="color: #0000FF;">?</span><span style="color: #000000;">9</span><span style="color: #0000FF;">/</span><span style="color: #000000;">0</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
function evaluate(object s)
|
||||
if atom(s) then
|
||||
if s>=1 then s = flags[s] end if
|
||||
return s
|
||||
end if
|
||||
object {lhs,op,rhs} = s
|
||||
lhs = evaluate(lhs)
|
||||
rhs = evaluate(rhs)
|
||||
if op="and" then
|
||||
return lhs and rhs
|
||||
elsif op="or" then
|
||||
return lhs or rhs
|
||||
elsif op="xor" then
|
||||
return lhs xor rhs
|
||||
elsif op="not" then
|
||||
return not rhs
|
||||
else
|
||||
?9/0
|
||||
end if
|
||||
end function
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">next_comb</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">fdx</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">flags</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #000000;">flags</span><span style="color: #0000FF;">[</span><span style="color: #000000;">fdx</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">flags</span><span style="color: #0000FF;">[</span><span style="color: #000000;">fdx</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
|
||||
<span style="color: #000000;">fdx</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">fdx</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">false</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> <span style="color: #000080;font-style:italic;">-- all done</span>
|
||||
<span style="color: #000000;">flags</span><span style="color: #0000FF;">[</span><span style="color: #000000;">fdx</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #004600;">true</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
function next_comb()
|
||||
integer fdx = length(flags)
|
||||
while flags[fdx]=1 do
|
||||
flags[fdx] = 0
|
||||
fdx -= 1
|
||||
end while
|
||||
if fdx<=2 then return false end if -- all done
|
||||
flags[fdx] = 1
|
||||
return true
|
||||
end function
|
||||
|
||||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">test</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">expr</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">opstack</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
|
||||
<span style="color: #000000;">op</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
|
||||
<span style="color: #000000;">names</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"false"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"true"</span><span style="color: #0000FF;">}</span>
|
||||
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">expr</span>
|
||||
<span style="color: #000000;">sidx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
|
||||
<span style="color: #000000;">nxtch</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #000000;">get_token</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #000000;">Expr</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">op</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #000000;">PopFactor</span><span style="color: #0000FF;">()</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">opstack</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000000;">err</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"some error"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">flags</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">names</span><span style="color: #0000FF;">))</span>
|
||||
<span style="color: #000000;">flags</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span> <span style="color: #000080;font-style:italic;">-- set "true" true</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">names</span><span style="color: #0000FF;">[</span><span style="color: #000000;">3</span><span style="color: #0000FF;">..$]),</span><span style="color: #000000;">s</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">3</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">flags</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- (skipping true&false)</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s%s"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">fmt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">flags</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]),</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">names</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]))})</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">fmt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">evaluate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">opstack</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]))})</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">next_comb</span><span style="color: #0000FF;">()</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
|
||||
procedure test(string expr)
|
||||
opstack = {}
|
||||
op = 0
|
||||
names = {"false","true"}
|
||||
s = expr
|
||||
sidx = 0
|
||||
nxtch()
|
||||
get_token()
|
||||
Expr(0)
|
||||
if op!=0 then PopFactor() end if
|
||||
if length(opstack)!=1 then err("some error") end if
|
||||
flags = repeat(0,length(names))
|
||||
flags[2] = 1 -- set "true" true
|
||||
printf(1,"%s %s\n",{join(names[3..$]),s})
|
||||
while 1 do
|
||||
for i=3 to length(flags) do -- (skipping true&false)
|
||||
printf(1,"%s%s",{fmt(flags[i]),repeat(' ',length(names[i]))})
|
||||
end for
|
||||
printf(1," %s\n",{fmt(evaluate(opstack[1]))})
|
||||
if not next_comb() then exit end if
|
||||
end while
|
||||
puts(1,"\n")
|
||||
end procedure
|
||||
|
||||
<span style="color: #000000;">test</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"young and not (ugly or poor)"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span> <span style="color: #000080;font-style:italic;">-- (no gets(0) in a browser)</span>
|
||||
<span style="color: #008080;">while</span> <span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"input expression:"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">string</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">trim</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">gets</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">))</span>
|
||||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">=</span><span style="color: #008000;">""</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #000000;">test</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<!--
|
||||
test("young and not (ugly or poor)")
|
||||
if platform()!=JS then -- (no gets(0) in a browser)
|
||||
while 1 do
|
||||
puts(1,"input expression:")
|
||||
string t = trim(gets(0))
|
||||
puts(1,"\n")
|
||||
if t="" then exit end if
|
||||
test(t)
|
||||
end while
|
||||
end if
|
||||
|
|
|
|||
84
Task/Truth-table/Pluto/truth-table.pluto
Normal file
84
Task/Truth-table/Pluto/truth-table.pluto
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
require "queue"
|
||||
require "io2"
|
||||
|
||||
class Variable
|
||||
function __construct(public name, public value) end
|
||||
end
|
||||
|
||||
-- Use integer constants as bools don't support bitwise operators.
|
||||
local FALSE = 0
|
||||
local TRUE = 1
|
||||
|
||||
local expr = ""
|
||||
local variables = {}
|
||||
|
||||
local is_operator = |op| -> op in "&|!~"
|
||||
|
||||
local is_variable = |s| -> variables:mapped(|v| -> v.name):contains(s)
|
||||
|
||||
local function eval_expression()
|
||||
local stk = new stack()
|
||||
for expr:split("") as e do
|
||||
local v
|
||||
if (e == "T") then
|
||||
v = TRUE
|
||||
elseif e == "F" then
|
||||
v = FALSE
|
||||
elseif is_variable(e) then
|
||||
local vs = variables:filtered(|va| -> va.name == e):reorder()
|
||||
assert(#vs == 1, $"Can only be one variable with name {e}.")
|
||||
v = vs[1].value
|
||||
elseif e == "&" then
|
||||
v = stk:pop() & stk:pop()
|
||||
elseif e == "|" then
|
||||
v = stk:pop() | stk:pop()
|
||||
elseif e == "!" then
|
||||
v = (stk:pop() == TRUE) ? FALSE : TRUE
|
||||
elseif e == "~" then
|
||||
v = stk:pop() ~ stk:pop()
|
||||
else
|
||||
Fiber.abort($"Non-conformant character {e} in expression.")
|
||||
end
|
||||
stk:push(v)
|
||||
end
|
||||
assert(stk:size() == 1, "Something went wrong!")
|
||||
return stk:peek()
|
||||
end
|
||||
|
||||
local function set_variables(pos)
|
||||
local vc = #variables
|
||||
assert(pos <= vc, $"Argument cannot exceed {vc}.")
|
||||
if pos == vc then
|
||||
local vs = variables:mapped(|v| -> (v.value == TRUE) ? "T" : "F")
|
||||
local es = eval_expression() == TRUE ? "T" : "F"
|
||||
print($"{vs:concat(" ")} {es}")
|
||||
return
|
||||
end
|
||||
variables[pos + 1].value = FALSE
|
||||
set_variables(pos + 1)
|
||||
variables[pos + 1].value = TRUE
|
||||
set_variables(pos + 1)
|
||||
end
|
||||
|
||||
print("Accepts single-character variables (except for 'T' and 'F',")
|
||||
print("which specify explicit true or false values), postfix, with")
|
||||
print("&|!~ for and, or, not, xor, respectively; optionally")
|
||||
print("seperated by spaces or tabs. Just enter nothing to quit.")
|
||||
|
||||
while true do
|
||||
expr = io.readStr("\nBoolean expression: ")
|
||||
if expr == "" then break end
|
||||
expr = expr:upper():replace(" ", ""):replace("\t", "")
|
||||
variables:clear()
|
||||
for expr:split("") as e do
|
||||
if !is_operator(e) and !"TF":contains(e) and !is_variable(e) then
|
||||
variables:insert(new Variable(e, FALSE))
|
||||
end
|
||||
end
|
||||
if #variables == 0 then break end
|
||||
local vs = variables:mapped(|v| -> v.name):concat(" ")
|
||||
print($"\n{vs} {expr}")
|
||||
local h = #vs + #expr + 2
|
||||
print(string.rep("=", h))
|
||||
set_variables(0)
|
||||
end
|
||||
26
Task/Truth-table/Ring/truth-table.ring
Normal file
26
Task/Truth-table/Ring/truth-table.ring
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
load "stdlib.ring"
|
||||
|
||||
table1 = "A or B"
|
||||
table2 = "A and B"
|
||||
vars = ["A", "B"]
|
||||
|
||||
see table1 + nl
|
||||
see "A | B | Output" + nl
|
||||
see "----------" + nl
|
||||
result("A","B",table1)
|
||||
see nl+table2 + nl
|
||||
see "A | B | Output" + nl
|
||||
see "----------" + nl
|
||||
result("A","B",table2)
|
||||
|
||||
func result(A,B,table)
|
||||
for a_res = 0 to 1
|
||||
for b_res = 0 to 1
|
||||
A = a_res
|
||||
B = b_res
|
||||
|
||||
output = eval("return " + table)
|
||||
|
||||
see "" + A + " | " + B + " | " + output + nl
|
||||
next
|
||||
next
|
||||
Loading…
Add table
Add a link
Reference in a new issue