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)) |