67 lines
1.3 KiB
Plaintext
67 lines
1.3 KiB
Plaintext
parse=:parse_parser_
|
|
eval=:monad define
|
|
'gerund structure'=:y
|
|
gerund@.structure
|
|
)
|
|
|
|
coclass 'parser'
|
|
classify=: '$()*/+-'&(((>:@#@[ # 2:) #: 2 ^ i.)&;:)
|
|
|
|
rules=: ''
|
|
patterns=: ,"0 assert 1
|
|
|
|
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'
|
|
|
|
buildTree=: monad define
|
|
words=: ;:'$',y
|
|
queue=: classify '$',y
|
|
stack=: classify '$$$$'
|
|
tokens=: ]&.>i.#words
|
|
tree=: ''
|
|
while.(#queue)+.6<#stack do.
|
|
rule=: rules {~ i.&1 patterns (*./"1)@:(+./"1) .(*."1)4{.stack
|
|
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
|
|
)
|
|
|
|
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
|
|
)
|