SDF_Production PTProductionToSDFProduction(PT_Production ptProduction) { PT_Symbols ptLhs; PT_Symbol ptRhs; PT_Attributes ptAttributes; SDF_Symbols sdfLhs; SDF_Symbol sdfRhs; SDF_Attributes sdfAttributes; ptLhs = PT_getProductionLhs(ptProduction); sdfLhs = PTSymbolsToSDFSymbols(ptLhs); ptRhs = PT_getProductionRhs(ptProduction); sdfRhs = PTSymbolToSDFSymbol(ptRhs); ptAttributes = PT_getProductionAttributes(ptProduction); sdfAttributes = PTAttributesToSDFAttributes(ptAttributes); return SDF_makeProductionProd(sdfLhs, SDF_makeLayoutSpace(), SDF_makeLayoutSpace(), sdfRhs, SDF_makeLayoutSpace(), sdfAttributes); }
SDF_SymbolList SDF_insertSymbol(SDF_Symbol r, SDF_SymbolList l) { if (SDF_isSymbolListEmpty(l)) { return SDF_makeSymbolListSingle(r); } else { return SDF_makeSymbolListMany(r, SDF_makeLayoutSpace(), l); } }
SDF_RenamingList SDF_insertRenaming(SDF_Renaming r, SDF_RenamingList l) { if (SDF_isRenamingListEmpty(l)) { return SDF_makeRenamingListSingle(r); } else { return SDF_makeRenamingListMany(r, SDF_makeLayoutSpace(), l); } }
static void collect_cf_prods(SDF_Grammar grammar, SDF_ProductionList *cfProds) { if (SDF_isGrammarContextFreeSyntax(grammar)) { SDF_Productions grammarProds = SDF_getGrammarProductions(grammar); SDF_ProductionList prods = SDF_getProductionsList(grammarProds); *cfProds = SDF_concatProductionList(*cfProds, SDF_makeLayoutSpace(), prods); } }
static void collect_lex_prods(SDF_Grammar grammar, SDF_ProductionList *lexProds) { if (SDF_isGrammarLexicalSyntax(grammar)) { SDF_Productions grammarProds = SDF_getGrammarProductions(grammar); SDF_ProductionList prods = SDF_getProductionsList(grammarProds); *lexProds = SDF_concatProductionList(*lexProds, SDF_makeLayoutSpace(), prods); } }
static void collect_var_prods(SDF_Grammar grammar, SDF_ProductionList *varProds) { if (SDF_isGrammarVariables(grammar)) { SDF_Productions grammarProds = SDF_getGrammarProductions(grammar); SDF_ProductionList prods = SDF_getProductionsList(grammarProds); *varProds = SDF_concatProductionList(*varProds, SDF_makeLayoutSpace(), prods); } }
static void collect_kernel_prods(SDF_Grammar grammar, SDF_ProductionList *prods) { if (SDF_isGrammarSyntax(grammar)) { SDF_Productions grammarProds = SDF_getGrammarProductions(grammar); SDF_ProductionList lexProds = SDF_getProductionsList(grammarProds); *prods = SDF_concatProductionList(*prods, SDF_makeLayoutSpace(), lexProds); } }
static void collect_all_prods(SDF_Grammar grammar, SDF_ProductionList *allProds) { if (SDF_hasGrammarProductions(grammar)) { SDF_Productions grammarProds = SDF_getGrammarProductions(grammar); SDF_ProductionList prods = SDF_getProductionsList(grammarProds); *allProds = SDF_concatProductionList(*allProds, SDF_makeLayoutSpace(), prods); } }
static SDF_SymbolList PTSymbolsToSDFSymbolList(PT_Symbols ptSymbols) { PT_Symbol ptHead; SDF_Symbol sdfHead; PT_Symbol ptLayout; PT_Symbols ptTail; SDF_SymbolList sdfTail; SDF_SymbolList result; switch (PT_getSymbolsLength(ptSymbols)) { case 0: result = SDF_makeSymbolListEmpty(); break; case 1: ptHead = PT_getSymbolsHead(ptSymbols); sdfHead = PTSymbolToSDFSymbol(ptHead); result = SDF_makeSymbolListSingle(sdfHead); break; default: ptHead = PT_getSymbolsHead(ptSymbols); assert(!PT_isOptLayoutSymbol(ptHead)); ptTail = PT_getSymbolsTail(ptSymbols); ptLayout = PT_getSymbolsHead(ptTail); assert(PT_isOptLayoutSymbol(ptLayout)); ptTail = PT_getSymbolsTail(ptTail); sdfHead = PTSymbolToSDFSymbol(ptHead); sdfTail = PTSymbolsToSDFSymbolList(ptTail); result = SDF_makeSymbolListMany(sdfHead, SDF_makeLayoutSpace(), sdfTail); break; } return result; }
SDF_Symbol PTSymbolToSDFSymbol(PT_Symbol ptSymbol) { SDF_Symbol result; if (PT_isSymbolLit(ptSymbol)) { char *str = PT_getSymbolString(ptSymbol); char *qstr = escape(str, "\"\\", QUOTED); SDF_Literal lit = SDF_makeLiteralQlit(SDF_makeQLiteralQuoted(SDF_makeCHARLISTString(qstr))); free(qstr); result = SDF_makeSymbolLit(lit); } else if (PT_isSymbolCf(ptSymbol) || PT_isSymbolLex(ptSymbol) || PT_isSymbolVarSym(ptSymbol)) { result = PTSymbolToSDFSymbol(PT_getSymbolSymbol(ptSymbol)); } else if (PT_isSymbolEmpty(ptSymbol)) { result = SDF_makeSymbolEmpty(SDF_makeLayoutEmpty()); } else if (PT_isSymbolSeq(ptSymbol)) { PT_Symbols ptSymbols = PT_getSymbolSymbols(ptSymbol); PT_Symbol ptHead = PT_getSymbolsHead(ptSymbols); SDF_Symbol sdfHead = PTSymbolToSDFSymbol(ptHead); PT_Symbols ptTail = PT_getSymbolsTail(ptSymbols); if (PT_isSymbolsEmpty(ptTail)) { ATabort("PTSymbolToSDFSymbol: empty tail in %s\n", PT_yieldSymbol(ptSymbol)); result = NULL; } else { SDF_SymbolTail sdfSymbolTail = (SDF_SymbolTail)PTSymbolsToSDFSymbolList(ptTail); result = SDF_makeSymbolSeq(SDF_makeLayoutEmpty(), sdfHead, SDF_makeLayoutSpace(), sdfSymbolTail, SDF_makeLayoutEmpty()); } } else if (PT_isSymbolOpt(ptSymbol)) { SDF_Symbol sdfSymbol = PTSymbolToSDFSymbol(PT_getSymbolSymbol(ptSymbol)); result = SDF_makeSymbolOpt(sdfSymbol, SDF_makeLayoutEmpty()); } else if (PT_isSymbolAlt(ptSymbol)) { SDF_Symbol sdfLhs = PTSymbolToSDFSymbol(PT_getSymbolLhs(ptSymbol)); SDF_Symbol sdfRhs = PTSymbolToSDFSymbol(PT_getSymbolRhs(ptSymbol)); result = SDF_makeSymbolAlt(sdfLhs, SDF_makeLayoutEmpty(), SDF_makeLayoutEmpty(), sdfRhs); } else if (PT_isSymbolTuple(ptSymbol)) { SDF_Symbol sdfHead = PTSymbolToSDFSymbol(PT_getSymbolHead(ptSymbol)); SDF_SymbolRest sdfRest = PTSymbolsToSDFSymbolRest(PT_getSymbolRest(ptSymbol)); result = SDF_makeSymbolTuple(SDF_makeLayoutEmpty(), sdfHead, SDF_makeLayoutEmpty(), SDF_makeLayoutEmpty(), sdfRest, SDF_makeLayoutEmpty()); } else if (PT_isSymbolSort(ptSymbol)) { char *str = PT_getSymbolSort(ptSymbol); SDF_Sort sort = SDF_makeSortMoreChars(SDF_makeCHARLISTString(str)); result = SDF_makeSymbolSort(sort); } else if (PT_isSymbolIterPlus(ptSymbol)) { SDF_Symbol sdfSymbol = PTSymbolToSDFSymbol(PT_getSymbolSymbol(ptSymbol)); result = SDF_makeSymbolIter(sdfSymbol, SDF_makeLayoutEmpty()); } else if (PT_isSymbolIterStar(ptSymbol)) { SDF_Symbol sdfSymbol = PTSymbolToSDFSymbol(PT_getSymbolSymbol(ptSymbol)); result = SDF_makeSymbolIterStar(sdfSymbol, SDF_makeLayoutEmpty()); } else if (PT_isSymbolIterPlusSep(ptSymbol)) { SDF_Symbol sdfSymbol = PTSymbolToSDFSymbol(PT_getSymbolSymbol(ptSymbol)); SDF_Symbol sdfSep = PTSymbolToSDFSymbol(PT_getSymbolSeparator(ptSymbol)); result = SDF_makeSymbolIterSep(SDF_makeLayoutEmpty(), sdfSymbol, SDF_makeLayoutSpace(), sdfSep, SDF_makeLayoutEmpty(), SDF_makeLayoutEmpty()); } else if (PT_isSymbolIterStarSep(ptSymbol)) { SDF_Symbol sdfSymbol = PTSymbolToSDFSymbol(PT_getSymbolSymbol(ptSymbol)); SDF_Symbol sdfSep = PTSymbolToSDFSymbol(PT_getSymbolSeparator(ptSymbol)); result = SDF_makeSymbolIterStarSep(SDF_makeLayoutEmpty(), sdfSymbol, SDF_makeLayoutSpace(), sdfSep, SDF_makeLayoutEmpty(), SDF_makeLayoutEmpty()); } else if (PT_isSymbolIterN(ptSymbol)) { char str[BUFSIZ]; SDF_Symbol sdfSymbol = PTSymbolToSDFSymbol(PT_getSymbolSymbol(ptSymbol)); int nr = PT_getSymbolNumber(ptSymbol); SDF_NatCon sdfNatCon; sprintf(str, "%d", nr); sdfNatCon = SDF_makeNatConDigits(SDF_makeCHARLISTString(str)); result = SDF_makeSymbolIterN(sdfSymbol, SDF_makeLayoutSpace(), sdfNatCon, SDF_makeLayoutEmpty()); } else if (PT_isSymbolIterSepN(ptSymbol)) { char str[BUFSIZ]; SDF_Symbol sdfSymbol = PTSymbolToSDFSymbol(PT_getSymbolSymbol(ptSymbol)); SDF_Symbol sdfSep = PTSymbolToSDFSymbol(PT_getSymbolSeparator(ptSymbol)); int nr = PT_getSymbolNumber(ptSymbol); SDF_NatCon sdfNatCon; sprintf(str, "%d", nr); sdfNatCon = SDF_makeNatConDigits(SDF_makeCHARLISTString(str)); result = SDF_makeSymbolIterSepN(SDF_makeLayoutEmpty(), sdfSymbol, SDF_makeLayoutSpace(), sdfSep, SDF_makeLayoutEmpty(), SDF_makeLayoutEmpty(), sdfNatCon, SDF_makeLayoutEmpty()); } else if (PT_isSymbolLayout(ptSymbol)) { ATabort("PTSymbolToSDFSymbol: layout.\n"); result = NULL; } else { ATabort("PTSymbolToSDFSymbol: unable to convert symbol %t: %s\n", ptSymbol, PT_yieldSymbol(ptSymbol)); result = NULL; } return result; }