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