src/Pure/Syntax/syntax.ML
changeset 27768 398c64b2acef
parent 27265 49c81f6d7a08
child 27786 4525c6f5d753
equal deleted inserted replaced
27767:b52c0c81dcf3 27768:398c64b2acef
   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 =