dom :: XMLProcessor :: parse_document
# Parses a full XML document
fun parse_document: XMLEntity do
var stack = new Array[XMLStartTag]
var doc = new XMLDocument
loop
ignore_whitespaces
if pos >= src.length then break
if src[pos] == '<' then
var tag = read_tag
if tag isa XMLStartTag then
if stack.is_empty then
tag.parent = doc
else
var st_last = stack.last
tag.parent = st_last
end
stack.push tag
else if tag isa XMLEndTag then
if stack.is_empty then
return new XMLError(tag.location, "Missing matching tag for `{tag.tag_name}`")
end
var st_last = stack.last
if tag.tag_name == st_last.tag_name then
st_last.matching = tag
tag.matching = st_last
stack.pop
else
var miss = stack.pop
return new XMLError(miss.location, "Missing matching tag for `{miss.tag_name}`")
end
else if tag isa XMLError then
return tag
else
if stack.is_empty then
tag.parent = doc
else
tag.parent = stack.last
end
end
else
var st = pos
var end_pc = ignore_until("<") - 1
var loc = new Location(line, line_offset)
var pc = new PCDATA(loc, src.substring(st, end_pc - st + 1).trim)
if stack.is_empty then
pc.parent = doc
else
pc.parent = stack.last
end
end
end
if not stack.is_empty then
var miss = stack.pop
return new XMLError(miss.location, "Missing matching tag for `{miss.tag_name}`")
end
return doc
end
lib/dom/parser.nit:21,2--77,4