equal
  deleted
  inserted
  replaced
  
    
    
   202   r}. If you want to generate the correct error message for p-followed-by-q,  | 
   202   r}. If you want to generate the correct error message for p-followed-by-q,  | 
   203   then you have to write:  | 
   203   then you have to write:  | 
   204 *}  | 
   204 *}  | 
   205   | 
   205   | 
   206 ML{*fun p_followed_by_q p q r = | 
   206 ML{*fun p_followed_by_q p q r = | 
   207   let   | 
   207 let   | 
   208      val err_msg = (fn _ => p ^ " is not followed by " ^ q)  | 
   208   val err_msg = (fn _ => p ^ " is not followed by " ^ q)  | 
   209   in  | 
   209 in  | 
   210     ($$ p -- (!! err_msg ($$ q))) || ($$ r -- $$ r)  | 
   210   ($$ p -- (!! err_msg ($$ q))) || ($$ r -- $$ r)  | 
   211   end *}  | 
   211 end *}  | 
   212   | 
   212   | 
   213   | 
   213   | 
   214 text {* | 
   214 text {* | 
   215   Running this parser with the @{text [quotes] "h"} and @{text [quotes] "e"}, and  | 
   215   Running this parser with the @{text [quotes] "h"} and @{text [quotes] "e"}, and  | 
   216   the input @{text [quotes] "holle"}  | 
   216   the input @{text [quotes] "holle"}  | 
   346   | 
   346   | 
   347 section {* Parsing Theory Syntax *} | 
   347 section {* Parsing Theory Syntax *} | 
   348   | 
   348   | 
   349 text {* | 
   349 text {* | 
   350   Most of the time, however, Isabelle developers have to deal with parsing  | 
   350   Most of the time, however, Isabelle developers have to deal with parsing  | 
   351   tokens, not strings.  These token parsers will have the type  | 
   351   tokens, not strings.  These token parsers will have the type:  | 
   352 *}  | 
   352 *}  | 
   353     | 
   353     | 
   354 ML{*type 'a parser = OuterLex.token list -> 'a * OuterLex.token list*} | 
   354 ML{*type 'a parser = OuterLex.token list -> 'a * OuterLex.token list*} | 
   355   | 
   355   | 
   356 text {* | 
   356 text {* | 
   725 end" "(foo_lemma, [((\"intro\", []), \<dots>), ((\"dest\", [\<dots>]), \<dots>)])"}  | 
   725 end" "(foo_lemma, [((\"intro\", []), \<dots>), ((\"dest\", [\<dots>]), \<dots>)])"}  | 
   726    | 
   726    | 
   727   The function @{ML opt_thm_name in SpecParse} is the ``optional'' variant of | 
   727   The function @{ML opt_thm_name in SpecParse} is the ``optional'' variant of | 
   728   @{ML thm_name in SpecParse}. Theorem names can contain attributes. The name  | 
   728   @{ML thm_name in SpecParse}. Theorem names can contain attributes. The name  | 
   729   has to end with @{text [quotes] ":"}---see the argument of  | 
   729   has to end with @{text [quotes] ":"}---see the argument of  | 
   730   @{ML SpecParse.opt_thm_name} in Line 9. | 
   730   the function @{ML SpecParse.opt_thm_name} in Line 9. | 
   731   | 
   731   | 
   732   \begin{readmore} | 
   732   \begin{readmore} | 
   733   Attributes and arguments are implemented in the files @{ML_file "Pure/Isar/attrib.ML"}  | 
   733   Attributes and arguments are implemented in the files @{ML_file "Pure/Isar/attrib.ML"}  | 
   734   and @{ML_file "Pure/Isar/args.ML"}. | 
   734   and @{ML_file "Pure/Isar/args.ML"}. | 
   735   \end{readmore} | 
   735   \end{readmore} |