src/Pure/Syntax/parser.ML
changeset 80965 f74aecc6ef9c
parent 80964 f9230aabcc2a
child 80968 a9e18ab3a625
equal deleted inserted replaced
80964:f9230aabcc2a 80965:f74aecc6ef9c
   436       in (Nonterminal (tag, p), tags') end
   436       in (Nonterminal (tag, p), tags') end
   437   | SOME tok => (Terminal tok, tags));
   437   | SOME tok => (Terminal tok, tags));
   438 
   438 
   439 fun extend_gram xprods gram =
   439 fun extend_gram xprods gram =
   440   let
   440   let
   441     fun make_symbs (Syntax_Ext.Delim s :: xsyms) result tags =
   441     fun make_symbs (Syntax_Ext.Delim s :: xsyms) tags =
   442           make_symbs xsyms (Terminal (Lexicon.literal s) :: result) tags
   442           let val (syms, tags') = make_symbs xsyms tags
   443       | make_symbs (Syntax_Ext.Argument a :: xsyms) result tags =
   443           in (Terminal (Lexicon.literal s) :: syms, tags') end
   444           let val (new_symb, tags') = make_arg a tags
   444       | make_symbs (Syntax_Ext.Argument a :: xsyms) tags =
   445           in make_symbs xsyms (new_symb :: result) tags' end
   445           let
   446       | make_symbs (_ :: xsyms) result tags = make_symbs xsyms result tags
   446             val (arg, tags') = make_arg a tags;
   447       | make_symbs [] result tags = (rev result, tags);
   447             val (syms, tags'') = make_symbs xsyms tags';
       
   448           in (arg :: syms, tags'') end
       
   449       | make_symbs (_ :: xsyms) tags = make_symbs xsyms tags
       
   450       | make_symbs [] tags = ([], tags);
   448 
   451 
   449     fun make_prod (Syntax_Ext.XProd (lhs, xsymbs, const, pri)) (result, tags) =
   452     fun make_prod (Syntax_Ext.XProd (lhs, xsymbs, const, pri)) (result, tags) =
   450       let
   453       let
   451         val (tag, tags') = make_tag lhs tags;
   454         val (tag, tags') = make_tag lhs tags;
   452         val (symbs, tags'') = make_symbs xsymbs [] tags';
   455         val (symbs, tags'') = make_symbs xsymbs tags';
   453       in ((tag, (symbs, const, pri)) :: result, tags'') end;
   456       in ((tag, (symbs, const, pri)) :: result, tags'') end;
   454 
   457 
   455 
   458 
   456     val Gram {tags, chains, lambdas, prods} = gram;
   459     val Gram {tags, chains, lambdas, prods} = gram;
   457 
   460