(phixonline)-->
--
-- demo\rosetta\Compiler\parse.exw
-- ===============================
--
with javascript_semantics
include parse.e
procedure print_ast(object t)
if t == NULL then
printf(output_file,";\n")
else
integer ttype = t[1]
printf(output_file,tkNames[ttype])
if ttype=tk_Identifier then
printf(output_file," %s\n",t[2])
elsif ttype=tk_Integer then
printf(output_file," %d\n",t[2])
elsif ttype=tk_String then
printf(output_file," %s\n",enquote(t[2]))
else
printf(output_file,"\n")
print_ast(t[2])
print_ast(t[3])
end if
end if
end procedure
function ptree(object t)
if sequence(t) then
integer t1 = t[1]
t = deep_copy(t)
t[1] = tkNames[t1]
if not find(t1,{tk_Identifier,tk_String}) then
for i=2 to length(t) do
if t1=tk_Sequence and t[i]=NULL then
t[i] = "NULL"
else
t[i] = ptree(t[i])
end if
end for
end if
end if
return t
end function
procedure main(sequence cl)
open_files(cl)
toks = lex()
object t = parse()
print_ast(t)
pp(ptree(t),{pp_Nest,10,pp_Pause,0,pp_IntCh,false})
close_files()
end procedure
--main(command_line())
main({0,0,"test3.c"}) -- not parseable!
--main({0,0,"primes.c"}) -- as Algol, C, Python (apart from spacing)
--main({0,0,"count.c"}) -- as AWK ( "" )