Compiler/AST interpreter: Difference between revisions
Content added Content deleted
m (→{{header|Phix}}: added syntax colouring, marked p2js compatible) |
(J) |
||
Line 1,697: | Line 1,697: | ||
Total primes found: 26 |
Total primes found: 26 |
||
</pre> |
</pre> |
||
=={{header|J}}== |
|||
Implementation: |
|||
<lang J>outbuf=: '' |
|||
emit=:{{ |
|||
outbuf=: outbuf,y |
|||
if.LF e. outbuf do. |
|||
ndx=. outbuf i:LF |
|||
echo ndx{.outbuf |
|||
outbuf=: }.ndx}.outbuf |
|||
end. |
|||
}} |
|||
load_ast=: {{ |
|||
'node_types node_values'=: 2{.|:(({.,&<&<}.@}.)~ i.&' ');._2 y |
|||
1{::0 load_ast '' |
|||
: |
|||
node_type=. x{::node_types |
|||
if. node_type-:,';' do. x;a: return.end. |
|||
node_value=. x{::node_values |
|||
if. -.''-:node_value do.x;<node_type make_leaf node_value return.end. |
|||
'x left'=.(x+1) load_ast'' |
|||
'x right'=.(x+1) load_ast'' |
|||
x;<node_type make_node left right |
|||
}} |
|||
make_leaf=: ; |
|||
typ=: 0&{:: |
|||
val=: left=: 1&{:: |
|||
right=: 2&{:: |
|||
make_node=: {{m;n;<y}} |
|||
id2var=: 'var_',rplc&('z';'zz';'_';'_z') |
|||
interp=:{{ |
|||
if.y-:'' do.'' return.end. |
|||
V=. val y |
|||
W=. ;2}.y |
|||
select.typ y |
|||
case.'Integer'do._".V |
|||
case.'String'do.rplc&('\\';'\';'\n';LF) V-.'"' |
|||
case.'Identifier'do.".id2var V |
|||
case.'Assign'do.''[(id2var left V)=: interp W |
|||
case.'Multiply'do.V *&interp W |
|||
case.'Divide'do.V (*&* * <.@%&|)&interp W |
|||
case.'Mod'do.V (*&* * |~&|)&interp W |
|||
case.'Add'do.V +&interp W |
|||
case.'Subtract'do.V -&interp W |
|||
case.'Negate'do.-interp V |
|||
case.'Less'do.V <&interp W |
|||
case.'LessEqual'do.V <:&interp W |
|||
case.'Greater'do.V >&interp W |
|||
case.'GreaterEqual'do.V >&interp W |
|||
case.'Equal'do.V =&interp W |
|||
case.'NotEqual'do.V ~:&interp W |
|||
case.'Not'do.0=interp V |
|||
case.'And'do.V *.&interp W |
|||
case.'Or' do.V +.&interp W |
|||
case.'If'do.if.interp V do.interp left W else.interp right W end.'' |
|||
case.'While'do.while.interp V do.interp W end.'' |
|||
case.'Putc'do.emit u:interp V |
|||
case.'Prti'do.emit rplc&'_-'":interp V |
|||
case.'Prts'do.emit interp V |
|||
case.'Sequence'do. |
|||
interp V |
|||
interp W |
|||
'' |
|||
case.do.error'unknown node type ',typ y |
|||
end. |
|||
}} |
|||
ast_interp=: {{ |
|||
outbuf=:'' |
|||
interp load_ast y |
|||
if.#outbuf do. |
|||
echo outbuf |
|||
outbuf=:'' |
|||
end. |
|||
}} |
|||
</lang> |
|||
Task example: |
|||
<lang J>primes=:{{)n |
|||
/* |
|||
Simple prime number generator |
|||
*/ |
|||
count = 1; |
|||
n = 1; |
|||
limit = 100; |
|||
while (n < limit) { |
|||
k=3; |
|||
p=1; |
|||
n=n+2; |
|||
while ((k*k<=n) && (p)) { |
|||
p=n/k*k!=n; |
|||
k=k+2; |
|||
} |
|||
if (p) { |
|||
print(n, " is prime\n"); |
|||
count = count + 1; |
|||
} |
|||
} |
|||
print("Total primes found: ", count, "\n"); |
|||
}} |
|||
ast_interp syntax lex primes |
|||
3 is prime |
|||
5 is prime |
|||
7 is prime |
|||
11 is prime |
|||
13 is prime |
|||
17 is prime |
|||
19 is prime |
|||
23 is prime |
|||
29 is prime |
|||
31 is prime |
|||
37 is prime |
|||
41 is prime |
|||
43 is prime |
|||
47 is prime |
|||
53 is prime |
|||
59 is prime |
|||
61 is prime |
|||
67 is prime |
|||
71 is prime |
|||
73 is prime |
|||
79 is prime |
|||
83 is prime |
|||
89 is prime |
|||
97 is prime |
|||
101 is prime |
|||
Total primes found: 26 |
|||
</lang> |
|||
=={{header|Java}}== |
=={{header|Java}}== |
||
<lang java> |
<lang java> |
||
Line 1,939: | Line 2,074: | ||
</lang> |
</lang> |
||
=={{header|Julia}}== |
=={{header|Julia}}== |
||
<lang julia>struct Anode |
<lang julia>struct Anode |