Arithmetic evaluation: Difference between revisions

→‎{{header|J}}: Better way to prevent eating of empties
m (J: prevent wiki from eating empties)
(→‎{{header|J}}: Better way to prevent eating of empties)
Line 1,213:
 
=={{header|J}}==
<lang j>parse=:parse_parser_
eval=:monad define
'gerund structure'=:y
gerund@.structure
)
 
coclass 'parser'
classify=: '$()*/+-'&(((>:@#@[ # 2:) #: 2 ^ i.)&;:)
rules=: <nowiki>''</nowiki>
patterns=: ,"0 assert 1
rules=: ''
addrule=: dyad define
patterns=: ,"0 assert 1
rules=: rules,;:x
 
patterns=: patterns,+./@classify"1 y
addrule=: dyad define
)
rules=: rules,;:x
patterns=: patterns,+./@classify"1 y
'Term' addrule '$()', '0', '+-',: '0'
)
'Factor' addrule '$()+-', '0', '*/',: '0'
'Parens' addrule '(', '*/+-0', ')',: ')*/+-0$'
rules=: rules,;:'Move'
'Term' addrule '$()', '0', '+-',: '0'
buildTree=: monad define
'Factor' addrule '$()+-', '0', '*/',: '0'
words=: ;:'$',y
'Parens' addrule '(', '*/+-0', ')',: ')*/+-0$'
queue=: classify '$',y
rules=: rules,;:'Move'
stack=: classify '$$$$'
 
tokens=: ]&.>i.#words
buildTree=: monad define
tree=: <nowiki>''</nowiki>
words=: ;:'$',y
while.(#queue)+.6<#stack do.
queue=: classify '$',y
rule=: rules {~ i.&1 patterns (*./"1)@:(+./"1) .(*."1)4{.stack
stack=: classify '$$$$'
rule`:6<nowiki>''</nowiki>
tokens=: ]&.>i.#words
end.
tree=: ''
'syntax' assert 1 0 1 1 1 1 -: {:"1 stack
while.(#queue)+.6<#stack do.
gerund=: literal&.> (<,'%') (I. words=<,'/')} words
rule=: rules {~ i.&1 patterns (*./"1)@:(+./"1) .(*."1)4{.stack
gerund;1{tree
rule`:6''
)
end.
'syntax' assert 1 0 1 1 1 1 -: {:"1 stack
gerund=: literal&.> (<,'%') (I. words=<,'/')} words
gerund;1{tree
)
 
literal=:monad define ::]
".'t=.',y
5!:1<'t'
)
 
Term=: Factor=: monad define
stack=: ({.stack),(classify '0'),4}.stack
tree=: ({.tree),(<1 2 3{tree),4}.tree
)
literalParens=: monad define ::]
stack=: (1{stack),3}.stack
".'t=.',y
tree=: (1{tree),3}.tree
5!:1<'t'
)
Term=: FactorMove=: monad define
'syntax' assert 0<#queue
stack=: ({.stack),(classify '0'),4}.stack
treestack=: ({.tree),(<1 2 3{tree:queue),4}.treestack
queue=: }:queue
)
tree=: ({:tokens),tree
tokens=: }:tokens
Parens=: monad define
)
stack=: (1{stack),3}.stack
tree=: (1{tree),3}.tree
)
Move=: monad define
'syntax' assert 0<#queue
stack=: ({:queue),stack
queue=: }:queue
tree=: ({:tokens),tree
tokens=: }:tokens
)
parse=:monad define
tmp=: conew 'parser'
r=: buildTree__tmp y
coerase tmp
r
)
 
parse=:monad define
tmp=: conew 'parser'
r=: buildTree__tmp y
coerase tmp
r
)</lang>
example use:
eval parse '1+2*3/(4-5+6)'
 
eval parse '1+2*3/(4-5+6)'
2.2
 
You can also display the syntax tree, for example:
parse '1+1'
 
=={{header|Pascal}}==
Anonymous user