src/Pure/Syntax/parser.ML
changeset 552 fc92fac8b0de
parent 395 712dceb1ecc7
child 624 33b9b5da3e6f
equal deleted inserted replaced
551:4c139c37dbaf 552:fc92fac8b0de
     1 (*  Title:      Pure/Syntax/parser.ML
     1 (*  Title:      Pure/Syntax/parser.ML
     2     ID:         $Id$
     2     ID:         $Id$
     3     Author:     Sonia Mahjoub, Markus Wenzel and Carsten Clasohm, TU Muenchen
     3     Author:     Sonia Mahjoub, Markus Wenzel and Carsten Clasohm, TU Muenchen
     4 
     4 
     5 Isabelle's main parser (used for terms and typs).
     5 Isabelle's main parser (used for terms and types).
     6 
       
     7 TODO:
       
     8   extend_gram: remove 'roots' arg
       
     9 *)
     6 *)
    10 
     7 
    11 signature PARSER =
     8 signature PARSER =
    12 sig
     9 sig
    13   structure Lexicon: LEXICON
    10   structure Lexicon: LEXICON
    14   structure SynExt: SYN_EXT
    11   structure SynExt: SYN_EXT
    15   local open Lexicon SynExt SynExt.Ast in
    12   local open Lexicon SynExt SynExt.Ast in
    16     type gram
    13     type gram
    17     val empty_gram: gram
    14     val empty_gram: gram
    18     val extend_gram: gram -> string list -> xprod list -> gram
    15     val extend_gram: gram -> xprod list -> gram
    19     val merge_grams: gram -> gram -> gram
    16     val merge_grams: gram -> gram -> gram
    20     val pretty_gram: gram -> Pretty.T list
    17     val pretty_gram: gram -> Pretty.T list
    21     datatype parsetree =
    18     datatype parsetree =
    22       Node of string * parsetree list |
    19       Node of string * parsetree list |
    23       Tip of token
    20       Tip of token
    24     val parse: gram -> string -> token list -> parsetree list
    21     val parse: gram -> string -> token list -> parsetree list
    25   end
    22   end
    26 end;
    23 end;
    27 
    24 
    28 functor ParserFun(structure Symtab: SYMTAB and Lexicon: LEXICON
    25 functor ParserFun(structure Symtab: SYMTAB and Lexicon: LEXICON
    29   and SynExt: SYN_EXT) =
    26   and SynExt: SYN_EXT): PARSER =
    30 struct
    27 struct
    31 
    28 
    32 structure Pretty = SynExt.Ast.Pretty;
    29 structure Pretty = SynExt.Ast.Pretty;
    33 structure Lexicon = Lexicon;
    30 structure Lexicon = Lexicon;
    34 structure SynExt = SynExt;
    31 structure SynExt = SynExt;
   258 
   255 
   259 (* empty, extend, merge grams *)
   256 (* empty, extend, merge grams *)
   260 
   257 
   261 val empty_gram = mk_gram [];
   258 val empty_gram = mk_gram [];
   262 
   259 
   263 fun extend_gram (gram1 as Gram (prods1, _)) _ xprods2 =
   260 fun extend_gram (gram1 as Gram (prods1, _)) xprods2 =
   264   let
   261   let
   265     fun symb_of (Delim s) = Some (Terminal (Token s))
   262     fun symb_of (Delim s) = Some (Terminal (Token s))
   266       | symb_of (Argument (s, p)) =
   263       | symb_of (Argument (s, p)) =
   267           (case predef_term s of
   264           (case predef_term s of
   268             None => Some (Nonterminal (s, p))
   265             None => Some (Nonterminal (s, p))