match = re.match(child_line_pattern, line)
     if match is None:
-        raise MalformedCNF("Syntax error in child line \"\"\"%s\"\"\"" % line)
+        raise MalformedCNF("Syntax error in child line \"\"\"%s\"\"\""
+                           % from_latin1 (line))
     number, parent, varname, instance, data, comment = match.groups()
     return {
         "number"   : marshal_in_number   (number),
                 return (state, lines, None)
             if new_parent > parent:
                 # parent is further down in hierarchy -> new level
-                (state, children, new_parent) = parse_cnf_children(
-                    state, new_parent)
+                (state, children, new_parent) = \
+                    parse_cnf_children (state, new_parent)
                 cnf_line["children"] = children
                 current = get(state)
+                new_parent = get_parent(current)
+                if new_parent is None:
+                    # drop stack
+                    return (state, lines, None)
             if new_parent < parent:
                 # parent is further up in hierarchy -> pop level
                 return (state, lines, new_parent)