294 val changed = length input <> length input'; |
294 val changed = length input <> length input'; |
295 fun if_inout xs = if inout then xs else []; |
295 fun if_inout xs = if inout then xs else []; |
296 in |
296 in |
297 Syntax |
297 Syntax |
298 ({input = input', |
298 ({input = input', |
299 lexicon = if changed then Scan.extend_lexicon (SynExt.delims_of xprods) lexicon else lexicon, |
299 lexicon = |
|
300 if changed then fold Scan.extend_lexicon (SynExt.delims_of xprods) lexicon else lexicon, |
300 gram = if changed then Parser.extend_gram gram xprods else gram, |
301 gram = if changed then Parser.extend_gram gram xprods else gram, |
301 consts = Library.merge (op =) (consts1, filter_out NameSpace.is_qualified consts2), |
302 consts = Library.merge (op =) (consts1, filter_out NameSpace.is_qualified consts2), |
302 prmodes = insert (op =) mode (Library.merge (op =) (prmodes1, prmodes2)), |
303 prmodes = insert (op =) mode (Library.merge (op =) (prmodes1, prmodes2)), |
303 parse_ast_trtab = |
304 parse_ast_trtab = |
304 update_trtab "parse ast translation" (if_inout parse_ast_translation) parse_ast_trtab, |
305 update_trtab "parse ast translation" (if_inout parse_ast_translation) parse_ast_trtab, |
359 print_trtab = print_trtab2, print_ruletab = print_ruletab2, |
360 print_trtab = print_trtab2, print_ruletab = print_ruletab2, |
360 print_ast_trtab = print_ast_trtab2, tokentrtab = tokentrtab2, prtabs = prtabs2} = tabs2; |
361 print_ast_trtab = print_ast_trtab2, tokentrtab = tokentrtab2, prtabs = prtabs2} = tabs2; |
361 in |
362 in |
362 Syntax |
363 Syntax |
363 ({input = Library.merge (op =) (input1, input2), |
364 ({input = Library.merge (op =) (input1, input2), |
364 lexicon = Scan.merge_lexicons lexicon1 lexicon2, |
365 lexicon = Scan.merge_lexicons (lexicon1, lexicon2), |
365 gram = Parser.merge_grams gram1 gram2, |
366 gram = Parser.merge_grams gram1 gram2, |
366 consts = sort_distinct string_ord (consts1 @ consts2), |
367 consts = sort_distinct string_ord (consts1 @ consts2), |
367 prmodes = Library.merge (op =) (prmodes1, prmodes2), |
368 prmodes = Library.merge (op =) (prmodes1, prmodes2), |
368 parse_ast_trtab = |
369 parse_ast_trtab = |
369 merge_trtabs "parse ast translation" parse_ast_trtab1 parse_ast_trtab2, |
370 merge_trtabs "parse ast translation" parse_ast_trtab1 parse_ast_trtab2, |
462 |
463 |
463 fun read_asts ctxt is_logtype (Syntax (tabs, _)) xids root str = |
464 fun read_asts ctxt is_logtype (Syntax (tabs, _)) xids root str = |
464 let |
465 let |
465 val {lexicon, gram, parse_ast_trtab, ...} = tabs; |
466 val {lexicon, gram, parse_ast_trtab, ...} = tabs; |
466 val root' = if root <> "prop" andalso is_logtype root then SynExt.logic else root; |
467 val root' = if root <> "prop" andalso is_logtype root then SynExt.logic else root; |
467 val chars = Symbol.explode str; |
468 val chars = SymbolPos.explode (str, Position.none); |
468 val pts = Parser.parse gram root' (Lexicon.tokenize lexicon xids chars); |
469 val pts = Parser.parse gram root' (Lexicon.tokenize lexicon xids chars); |
469 val len = length pts; |
470 val len = length pts; |
470 |
471 |
471 val limit = ! ambiguity_limit; |
472 val limit = ! ambiguity_limit; |
472 fun show_pt pt = |
473 fun show_pt pt = |