Jump to content

Recursive descent parser generator: Difference between revisions

m
Undoing delete of J draft - I've a simple fix...
m (Nope, need to explicitly implement recursive descent)
m (Undoing delete of J draft - I've a simple fix...)
Line 355:
_0004 = _0002 + _0003
</pre>
 
=={{header|J}}==
 
J's native recursive descent parser is adequate for this task, if we map names appropriately.
 
Implementation:
 
<lang J>cocurrent 'base'
 
inlocale=: 4 :0 L:0
x,'_',y,'_'
)
 
parse=: 3 :0
sentence=. ;:y
opinds=. (;:'+*-')i.sentence
opfuns=. (;:'plus times minus') inlocale 'base'
scratch=. cocreate''
coinsert__scratch 'base'
names=. ~.sentence#~_1<:nc sentence
(names inlocale scratch)=: names
do__scratch ;:inv opinds}((#sentence)#"0 opfuns),sentence
)
 
op=: 1 :0
:
r=. genname''
emit r,'=:',x,m,y
r
)
 
plus=: '+' op
times=: '*' op
minus=: '-' op
 
N=: 10000
genname=: 3 :0
'z',}.":N=: N+1
)
 
emit=: smoutput</lang>
 
Task example:
 
<lang J> parse'(one + two) * three - four * five'
z0001=:four*five
z0002=:three-z0001
z0003=:one+two
z0004=:z0003*z0002
z0004</lang>
6,962

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.