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 |