ProgTutorial/Parsing.thy
changeset 193 ffd93dcc269d
parent 192 2fff636e1fa0
child 194 8cd51a25a7ca
--- a/ProgTutorial/Parsing.thy	Sat Mar 21 12:35:03 2009 +0100
+++ b/ProgTutorial/Parsing.thy	Mon Mar 23 12:13:33 2009 +0100
@@ -16,7 +16,7 @@
   parsing combinators. These combinators are a well-established technique for parsing, 
   which has, for example, been described in Paulson's classic ML-book \cite{paulson-ml2}.
   Isabelle developers are usually concerned with writing these outer syntax parsers, 
-  either for new definitional packages or for calling tactics with specific arguments. 
+  either for new definitional packages or for calling methods with specific arguments. 
 
   \begin{readmore}
   The library 
@@ -298,7 +298,7 @@
 
 @{ML_response [display,gray]
 "let 
-  fun double (x,y) = (x ^ x, y ^ y) 
+  fun double (x, y) = (x ^ x, y ^ y) 
 in
   (($$ \"h\") -- ($$ \"e\") >> double) (explode \"hello\")
 end"
@@ -318,6 +318,8 @@
   where the single-character strings in the parsed output are transformed
   back into one string.
  
+  (FIXME:  move to an earlier place)
+
   The function @{ML Scan.ahead} parses some input, but leaves the original
   input unchanged. For example:
 
@@ -492,8 +494,9 @@
 text {*
 
   The function @{ML "OuterParse.!!!"} can be used to force termination of the
-  parser in case of a dead end, just like @{ML "Scan.!!"} (see previous section), 
-  except that the error message is fixed to be @{text [quotes] "Outer syntax error"}
+  parser in case of a dead end, just like @{ML "Scan.!!"} (see previous section). 
+  Except that the error message of @{ML "OuterParse.!!!"} is fixed to be 
+  @{text [quotes] "Outer syntax error"}
   with a relatively precise description of the failure. For example:
 
 @{ML_response_fake [display,gray]
@@ -554,6 +557,12 @@
 
 *}
 
+section {* Context Parser (TBD) *}
+
+text {*
+  Used for example in \isacommand{attribute\_setup} and \isacommand{method\_setup}.
+*}
+
 section {* Parsing Inner Syntax *}
 
 text {*
@@ -711,6 +720,29 @@
   \end{readmore}
 *}
 
+text_raw {*
+  \begin{exercise}
+  If you look closely how @{ML SpecParse.where_alt_specs} is implemented
+  in file @{ML_file "Pure/Isar/spec_parse.ML"} and compare it to our @{ML "spec_parser"}, 
+  you can notice an additional ``tail'' (Lines 8 to 10):
+  \begin{isabelle}
+*}
+ML %linenosgray{*val spec_parser' = 
+     OuterParse.fixes -- 
+     Scan.optional
+     (OuterParse.$$$ "where" |-- 
+        OuterParse.!!! 
+          (OuterParse.enum1 "|" 
+             ((SpecParse.opt_thm_name ":" -- OuterParse.prop) --| 
+                  Scan.option (Scan.ahead (OuterParse.name || 
+                  OuterParse.$$$ "[") -- 
+                  OuterParse.!!! (OuterParse.$$$ "|"))))) [] *}
+text_raw {*
+  \end{isabelle}
+  What is the purpose of this additional ``tail''?
+  \end{exercise}
+*}
+
 section {* New Commands and Keyword Files\label{sec:newcommand} *}
 
 text {*
@@ -968,7 +1000,6 @@
   @{ML Toplevel.local_theory} do?)
 
   (FIXME read a name and show how to store theorems)
-
 *}
 
 section {* Methods *}
@@ -982,7 +1013,7 @@
 print_methods
 
 text {*
-  An example of a very simple method is the following code.
+  An example of a very simple method is:
 *}
 
 method_setup %gray foobar_meth = 
@@ -1007,6 +1038,14 @@
   \end{minipage} *}
 (*<*)oops(*>*)
 
+
+(*
+ML {* SIMPLE_METHOD *}
+ML {* METHOD *}
+ML {* K (SIMPLE_METHOD ((etac @{thm conjE} THEN' rtac @{thm conjI}) 1)) *}
+ML {* Scan.succeed  *}
+*)
+
 text {*
   (FIXME: explain a version of rule-tac)
 *}