allow multiple 'keywords' as in 'fixes';
authorwenzelm
Thu, 15 Mar 2012 09:55:42 +0100
changeset 478135b67ac48b384
parent 47812 cda018294515
child 47814 a40be2f10ca9
allow multiple 'keywords' as in 'fixes';
tuned comments;
src/Pure/Thy/thy_header.ML
src/Pure/Thy/thy_header.scala
     1.1 --- a/src/Pure/Thy/thy_header.ML	Thu Mar 15 00:10:45 2012 +0100
     1.2 +++ b/src/Pure/Thy/thy_header.ML	Thu Mar 15 09:55:42 2012 +0100
     1.3 @@ -1,7 +1,7 @@
     1.4  (*  Title:      Pure/Thy/thy_header.ML
     1.5 -    Author:     Markus Wenzel, TU Muenchen
     1.6 +    Author:     Makarius
     1.7  
     1.8 -Theory headers -- independent of outer syntax.
     1.9 +Static theory header information.
    1.10  *)
    1.11  
    1.12  signature THY_HEADER =
    1.13 @@ -80,7 +80,10 @@
    1.14  val theory_name = Parse.group (fn () => "theory name") Parse.name;
    1.15  
    1.16  val keyword_kind = Parse.group (fn () => "outer syntax keyword kind") (Parse.name -- Parse.tags);
    1.17 -val keyword_decl = Parse.name -- Scan.option (Parse.$$$ "::" |-- Parse.!!! keyword_kind);
    1.18 +val keyword_decl =
    1.19 +  Scan.repeat1 Parse.name -- Scan.option (Parse.$$$ "::" |-- Parse.!!! keyword_kind) >>
    1.20 +  (fn (names, kind) => map (rpair kind) names);
    1.21 +val keyword_decls = Parse.and_list1 keyword_decl >> flat;
    1.22  
    1.23  val file =
    1.24    Parse.$$$ "(" |-- Parse.!!! (file_name --| Parse.$$$ ")") >> rpair false ||
    1.25 @@ -91,7 +94,7 @@
    1.26  val args =
    1.27    theory_name --
    1.28    (Parse.$$$ importsN |-- Parse.!!! (Scan.repeat1 theory_name)) --
    1.29 -  Scan.optional (Parse.$$$ keywordsN |-- Parse.!!! (Parse.and_list1 keyword_decl)) [] --
    1.30 +  Scan.optional (Parse.$$$ keywordsN |-- Parse.!!! keyword_decls) [] --
    1.31    Scan.optional (Parse.$$$ usesN |-- Parse.!!! (Scan.repeat1 file)) [] --|
    1.32    Parse.$$$ beginN >>
    1.33    (fn (((name, imports), keywords), uses) => make name imports keywords uses);
     2.1 --- a/src/Pure/Thy/thy_header.scala	Thu Mar 15 00:10:45 2012 +0100
     2.2 +++ b/src/Pure/Thy/thy_header.scala	Thu Mar 15 09:55:42 2012 +0100
     2.3 @@ -1,7 +1,7 @@
     2.4  /*  Title:      Pure/Thy/thy_header.scala
     2.5      Author:     Makarius
     2.6  
     2.7 -Theory headers -- independent of outer syntax.
     2.8 +Static theory header information.
     2.9  */
    2.10  
    2.11  package isabelle
    2.12 @@ -51,11 +51,11 @@
    2.13      val keyword_kind =
    2.14        atom("outer syntax keyword kind", _.is_name) ~ tags ^^ { case x ~ y => (x, y) }
    2.15      val keyword_decl =
    2.16 -      name ~ opt(keyword("::") ~! keyword_kind ^^ { case _ ~ x => x }) ^^
    2.17 -      { case x ~ y => (x, y) }
    2.18 -    val keywords =
    2.19 +      rep1(name) ~ opt(keyword("::") ~! keyword_kind ^^ { case _ ~ x => x }) ^^
    2.20 +      { case xs ~ y => xs.map((_, y)) }
    2.21 +    val keyword_decls =
    2.22        keyword_decl ~ rep(keyword(AND) ~! keyword_decl ^^ { case _ ~ x => x }) ^^
    2.23 -      { case x ~ ys => x :: ys }
    2.24 +      { case xs ~ yss => (xs :: yss).flatten }
    2.25  
    2.26      val file =
    2.27        keyword("(") ~! (file_name ~ keyword(")")) ^^ { case _ ~ (x ~ _) => (x, false) } |
    2.28 @@ -64,7 +64,7 @@
    2.29      val args =
    2.30        theory_name ~
    2.31        (keyword(IMPORTS) ~! (rep1(theory_name)) ^^ { case _ ~ xs => xs }) ~
    2.32 -      (opt(keyword(KEYWORDS) ~! keywords) ^^ { case None => Nil case Some(_ ~ xs) => xs }) ~
    2.33 +      (opt(keyword(KEYWORDS) ~! keyword_decls) ^^ { case None => Nil case Some(_ ~ xs) => xs }) ~
    2.34        (opt(keyword(USES) ~! (rep1(file))) ^^ { case None => Nil case Some(_ ~ xs) => xs }) ~
    2.35        keyword(BEGIN) ^^
    2.36        { case x ~ ys ~ zs ~ ws ~ _ => Thy_Header(x, ys, zs, ws) }