src/Pure/Syntax/syntax.ML
changeset 14798 702cb4859cab
parent 14687 e089757b952a
child 14904 7d8dc92fcb7f
equal deleted inserted replaced
14797:546365fe8349 14798:702cb4859cab
   337     val toks = Lexicon.tokenize lexicon false chars;
   337     val toks = Lexicon.tokenize lexicon false chars;
   338     val _ = writeln ("tokens: " ^ space_implode " " (map Lexicon.display_token toks));
   338     val _ = writeln ("tokens: " ^ space_implode " " (map Lexicon.display_token toks));
   339 
   339 
   340     fun show_pt pt =
   340     fun show_pt pt =
   341       let
   341       let
   342         val raw_ast = SynTrans.pt_to_ast (K None) pt;
   342         val [raw_ast] = SynTrans.pts_to_asts (K None) [pt];
   343         val _ = writeln ("raw: " ^ Ast.str_of_ast raw_ast);
   343         val _ = writeln ("raw: " ^ Ast.str_of_ast raw_ast);
   344         val pre_ast = SynTrans.pt_to_ast (lookup_tr parse_ast_trtab) pt;
   344         val [pre_ast] = SynTrans.pts_to_asts (lookup_tr parse_ast_trtab) [pt];
   345         val _ = Ast.normalize true true (lookup_ruletab parse_ruletab) pre_ast;
   345         val _ = Ast.normalize true true (lookup_ruletab parse_ruletab) pre_ast;
   346       in () end;
   346       in () end;
   347   in seq show_pt (Parser.parse gram root toks) end;
   347   in seq show_pt (Parser.parse gram root toks) end;
   348 
   348 
   349 
   349 
   357     val root' = if root mem logtypes then SynExt.logic else root;
   357     val root' = if root mem logtypes then SynExt.logic else root;
   358     val chars = Symbol.explode str;
   358     val chars = Symbol.explode str;
   359     val pts = Parser.parse gram root' (Lexicon.tokenize lexicon xids chars);
   359     val pts = Parser.parse gram root' (Lexicon.tokenize lexicon xids chars);
   360 
   360 
   361     fun show_pt pt =
   361     fun show_pt pt =
   362       warning (Pretty.string_of (Ast.pretty_ast (SynTrans.pt_to_ast (K None) pt)));
   362       warning (Pretty.string_of (Ast.pretty_ast (hd (SynTrans.pts_to_asts (K None) [pt]))));
   363   in
   363   in
   364     if length pts > ! ambiguity_level then
   364     if length pts > ! ambiguity_level then
   365         if ! ambiguity_is_error then
   365         if ! ambiguity_is_error then
   366             error ("Ambiguous input " ^ quote str)
   366             error ("Ambiguous input " ^ quote str)
   367         else
   367         else
   368             (warning ("Ambiguous input " ^ quote str);
   368             (warning ("Ambiguous input " ^ quote str);
   369              warning "produces the following parse trees:";
   369              warning "produces the following parse trees:";
   370              seq show_pt pts)
   370              seq show_pt pts)
   371     else ();
   371     else ();
   372     map (SynTrans.pt_to_ast (lookup_tr parse_ast_trtab)) pts
   372     SynTrans.pts_to_asts (lookup_tr parse_ast_trtab) pts
   373   end;
   373   end;
   374 
   374 
   375 
   375 
   376 (* read *)
   376 (* read *)
   377 
   377 
   378 fun read (syn as Syntax tabs) ty str =
   378 fun read (syn as Syntax tabs) ty str =
   379   let
   379   let
   380     val {parse_ruletab, parse_trtab, ...} = tabs;
   380     val {parse_ruletab, parse_trtab, ...} = tabs;
   381     val asts = read_asts syn false (SynExt.typ_to_nonterm ty) str;
   381     val asts = read_asts syn false (SynExt.typ_to_nonterm ty) str;
   382   in
   382   in
   383     map (SynTrans.ast_to_term (lookup_tr parse_trtab))
   383     SynTrans.asts_to_terms (lookup_tr parse_trtab)
   384       (map (Ast.normalize_ast (lookup_ruletab parse_ruletab)) asts)
   384       (map (Ast.normalize_ast (lookup_ruletab parse_ruletab)) asts)
   385   end;
   385   end;
   386 
   386 
   387 
   387 
   388 (* read types *)
   388 (* read types *)