more precise parse_name according to XML standard;
authorwenzelm
Sat, 23 Jul 2011 20:11:18 +0200
changeset 4482194033767ef9b
parent 44819 8f5add916a99
child 44822 49f0e4ae2350
more precise parse_name according to XML standard;
tuned performance;
src/Pure/General/xml.ML
     1.1 --- a/src/Pure/General/xml.ML	Sat Jul 23 17:22:28 2011 +0200
     1.2 +++ b/src/Pure/General/xml.ML	Sat Jul 23 20:11:18 2011 +0200
     1.3 @@ -183,6 +183,10 @@
     1.4  val parse_optional_text =
     1.5    Scan.optional (parse_chars >> (single o Text)) [];
     1.6  
     1.7 +fun name_start_char c = Symbol.is_ascii_letter c orelse c = ":" orelse c = "_";
     1.8 +fun name_char c = name_start_char c orelse Symbol.is_ascii_digit c orelse c = "-" orelse c = ".";
     1.9 +val parse_name = Scan.one name_start_char ::: Scan.many name_char;
    1.10 +
    1.11  in
    1.12  
    1.13  val parse_comments =
    1.14 @@ -200,13 +204,14 @@
    1.15        @@@ parse_optional_text) >> flat)) xs
    1.16  
    1.17  and parse_element xs =
    1.18 -  ($$ "<" |-- Symbol.scan_id --
    1.19 -    Scan.repeat (blanks |-- parse_att) --| blanks :-- (fn (s, _) =>
    1.20 +  ($$ "<" |-- parse_name -- Scan.repeat (blanks |-- parse_att) --| blanks :--
    1.21 +    (fn (name, _) =>
    1.22        !! (err (fn () => "Expected > or />"))
    1.23 -        (Scan.this_string "/>" >> ignored
    1.24 -         || $$ ">" |-- parse_content --|
    1.25 -            !! (err (fn () => "Expected </" ^ s ^ ">"))
    1.26 -              (Scan.this_string ("</" ^ s) --| blanks --| $$ ">"))) >> Elem) xs;
    1.27 +       ($$ "/" -- $$ ">" >> ignored ||
    1.28 +        $$ ">" |-- parse_content --|
    1.29 +          !! (err (fn () => "Expected </" ^ implode name ^ ">"))
    1.30 +              ($$ "<" -- $$ "/" -- Scan.this name -- blanks -- $$ ">")))
    1.31 +    >> (fn ((name, atts), body) => Elem ((implode name, atts), body))) xs;
    1.32  
    1.33  val parse_document =
    1.34    (Scan.repeat parse_misc -- Scan.option parse_doctype -- Scan.repeat parse_misc)