Productions and token become elements
detached tokens and whitespaces are preserved in the XML
import parser_util
var text = "y += foo"
var ast = (new ToolContext).parse_something(text)
assert ast isa AExpr
ast.parentize_tokens
assert ast.to_xml.write_to_string == """<ACallReassignExpr><AQid><TId>y</TId></AQid> <APlusAssignOp><TPluseq>+=</TPluseq></APlusAssignOp> <ACallExpr><AQid><TId>foo</TId></AQid></ACallExpr></ACallReassignExpr>"""
# A XML representation of the AST
# Productions and token become elements
#
# detached tokens and whitespaces are preserved in the XML
#
# ~~~
# import parser_util
# var text = "y += foo"
# var ast = (new ToolContext).parse_something(text)
# assert ast isa AExpr
# ast.parentize_tokens
# assert ast.to_xml.write_to_string == """<ACallReassignExpr><AQid><TId>y</TId></AQid> <APlusAssignOp><TPluseq>+=</TPluseq></APlusAssignOp> <ACallExpr><AQid><TId>foo</TId></AQid></ACallExpr></ACallReassignExpr>"""
# ~~~
fun to_xml: HTMLTag
do
var res = new HTMLTag("AST")
var stack = new Array[HTMLTag]
var c = first_token
while c != null do
if c != first_token then res.append(c.blank_before)
var sp = c.starting_prods
if sp != null then for p in sp do
var tag = new HTMLTag(p.class_name)
res.add tag
stack.add res
res = tag
end
var tag = new HTMLTag(c.class_name)
res.add tag
tag.append c.text
var ep = c.ending_prods
if ep != null then for p in ep do
res = stack.pop
end
if c == last_token then
c = null
else
c = c.next_token
end
end
assert stack.is_empty
return res.children.first
end
src/astutil.nit:63,2--106,4