static PT_ParseTree applyRenamings(SDF_Renamings renamings, PT_ParseTree pt) { SDF_RenamingList symbolRenamingList = SDF_getRenamingsList(renamings); while (SDF_hasRenamingListHead(symbolRenamingList)) { SDF_Renaming renaming = SDF_getRenamingListHead(symbolRenamingList); if (SDF_isRenamingSymbol(renaming)) { SDF_Symbol fromSymbol = SDF_getRenamingFrom(renaming); SDF_Symbol toSymbol = SDF_getRenamingTo(renaming); pt = PT_renameInParseTree(pt, SDFSymbolToPtSymbol(fromSymbol), SDFSymbolToPtSymbol(toSymbol)); } if (SDF_hasRenamingListTail(symbolRenamingList)) { symbolRenamingList = SDF_getRenamingListTail(symbolRenamingList); } else { break; } } return pt; }
PT_Production SDFProductionToPtProduction(SDF_Production sdfProduction) { SDF_Symbol sdfResult; SDF_Attributes sdfAttributes; PT_Symbols ptSymbols; PT_Symbol ptResult; PT_Attributes ptAttributes; sdfResult = SDF_getProductionResult(sdfProduction); sdfAttributes = SDF_getProductionAttributes(sdfProduction); ptResult = SDFSymbolToPtSymbol(sdfResult); ptAttributes = SDFAttributesToPtAttributes(sdfAttributes); if (SDF_isProductionProd(sdfProduction)) { SDF_Symbols sdfSymbols = SDF_getProductionSymbols(sdfProduction); ptSymbols = SDFSymbolsToPtSymbols(sdfSymbols); } else { ATwarning("SDFProductionToPtProduction: unable to convert %s\n", PT_yieldTreeToString((PT_Tree) sdfProduction, ATfalse)); return NULL; } return PT_makeProductionDefault(ptSymbols, ptResult, ptAttributes); }
static PT_Symbols SDFSymbolRestToPtSymbols(SDF_SymbolRest sdfSymbols) { PT_Symbols ptSymbols = PT_makeSymbolsEmpty(); while (SDF_hasSymbolRestHead(sdfSymbols)) { SDF_Symbol sdfSymbol = SDF_getSymbolRestHead(sdfSymbols); PT_Symbol ptSymbol = SDFSymbolToPtSymbol(sdfSymbol); ptSymbols = PT_appendSymbols(ptSymbols, ptSymbol); if (SDF_isSymbolRestSingle(sdfSymbols)) { break; } sdfSymbols = SDF_getSymbolRestTail(sdfSymbols); } return ptSymbols; }
PT_Symbol SDFSymbolToPtSymbol(SDF_Symbol sdfSymbol) { PT_Symbol result = NULL; if (SDF_isSymbolStart(sdfSymbol)) { result = PT_makeSymbolSort("<START>"); } else if (SDF_isSymbolFileStart(sdfSymbol)) { result = PT_makeSymbolSort("<Start>"); } else if (SDF_isSymbolSort(sdfSymbol)) { char *str = PT_yieldTreeToString((PT_Tree) SDF_getSymbolSort(sdfSymbol), ATfalse); result = PT_makeSymbolSort(str); } else if (SDF_isSymbolLit(sdfSymbol)) { SDF_StrCon sdfLit = SDF_getSymbolString(sdfSymbol); const char *str = SDFStrConToString(sdfLit); result = PT_makeSymbolLit(str); } else if (SDF_isSymbolCiLit(sdfSymbol)) { SDF_SingleQuotedStrCon sdfLit = SDF_getSymbolCiString(sdfSymbol); const char *str = SDFCiStrConToString(sdfLit); result = PT_makeSymbolCilit(str); } else if (SDF_isSymbolIter(sdfSymbol)) { SDF_Symbol sdfIterSymbol = SDF_getSymbolSymbol(sdfSymbol); PT_Symbol ptIterSymbol = SDFSymbolToPtSymbol(sdfIterSymbol); result = PT_makeSymbolIterPlus(ptIterSymbol); } else if (SDF_isSymbolIterStar(sdfSymbol)) { SDF_Symbol sdfIterSymbol = SDF_getSymbolSymbol(sdfSymbol); PT_Symbol ptIterSymbol = SDFSymbolToPtSymbol(sdfIterSymbol); result = PT_makeSymbolIterStar(ptIterSymbol); } else if (SDF_isSymbolIterSep(sdfSymbol)) { SDF_Symbol sdfIterSymbol = SDF_getSymbolSymbol(sdfSymbol); SDF_Symbol sdfIterSep = SDF_getSymbolSep(sdfSymbol); PT_Symbol ptIterSymbol = SDFSymbolToPtSymbol(sdfIterSymbol); PT_Symbol ptSepSymbol = SDFSymbolToPtSymbol(sdfIterSep); result = PT_makeSymbolIterPlusSep(ptIterSymbol, ptSepSymbol); } else if (SDF_isSymbolIterStarSep(sdfSymbol)) { SDF_Symbol sdfIterSymbol = SDF_getSymbolSymbol(sdfSymbol); SDF_Symbol sdfIterSep = SDF_getSymbolSep(sdfSymbol); PT_Symbol ptIterSymbol = SDFSymbolToPtSymbol(sdfIterSymbol); PT_Symbol ptSepSymbol = SDFSymbolToPtSymbol(sdfIterSep); result = PT_makeSymbolIterStarSep(ptIterSymbol, ptSepSymbol); } else if (SDF_isSymbolCf(sdfSymbol)) { SDF_Symbol sdfSym = SDF_getSymbolSymbol(sdfSymbol); PT_Symbol ptSym = SDFSymbolToPtSymbol(sdfSym); result = PT_makeSymbolCf(ptSym); } else if (SDF_isSymbolLex(sdfSymbol)) { SDF_Symbol sdfSym = SDF_getSymbolSymbol(sdfSymbol); PT_Symbol ptSym = SDFSymbolToPtSymbol(sdfSym); result = PT_makeSymbolLex(ptSym); } else if (SDF_isSymbolVarsym(sdfSymbol)) { SDF_Symbol sdfSym = SDF_getSymbolSymbol(sdfSymbol); PT_Symbol ptSym = SDFSymbolToPtSymbol(sdfSym); result = PT_makeSymbolVarSym(ptSym); } else if (SDF_isSymbolLayout(sdfSymbol)) { result = PT_makeSymbolLayout(); } else if (SDF_isSymbolEmpty(sdfSymbol)) { result = PT_makeSymbolEmpty(); } else if (SDF_isSymbolSeq(sdfSymbol)) { SDF_Symbol sdfHead = SDF_getSymbolHead(sdfSymbol); /* tricky casting of SymbolTail to SymbolList */ SDF_SymbolList sdfTail = (SDF_SymbolList) SDF_getSymbolTail(sdfSymbol); SDF_Symbols sdfSymbols = SDF_makeSymbolsDefault(sdfTail); PT_Symbol ptHead = SDFSymbolToPtSymbol(sdfHead); PT_Symbols ptTail = SDFSymbolsToPtSymbols(sdfSymbols); result = PT_makeSymbolSeq(PT_makeSymbolsMany(ptHead, ptTail)); } else if (SDF_isSymbolOpt(sdfSymbol)) { SDF_Symbol sdfSym = SDF_getSymbolSymbol(sdfSymbol); PT_Symbol ptSym = SDFSymbolToPtSymbol(sdfSym); result = PT_makeSymbolOpt(ptSym); } else if (SDF_isSymbolTuple(sdfSymbol)) { SDF_Symbol sdfHead = SDF_getSymbolHead(sdfSymbol); SDF_SymbolRest sdfRest = SDF_getSymbolRest(sdfSymbol); PT_Symbol ptHead = SDFSymbolToPtSymbol(sdfHead); PT_Symbols ptRest = SDFSymbolRestToPtSymbols(sdfRest); result = PT_makeSymbolTuple(ptHead, ptRest); } else if (SDF_isSymbolFunc(sdfSymbol)) { SDF_Symbols sdfArguments = SDF_getSymbolArguments(sdfSymbol); SDF_Symbol sdfResult = SDF_getSymbolResults(sdfSymbol); PT_Symbols ptArguments = SDFSymbolsToPtSymbols(sdfArguments); PT_Symbol ptResult = SDFSymbolToPtSymbol(sdfResult); result = PT_makeSymbolFunc(ptArguments,ptResult); } else if (SDF_isSymbolParameterizedSort(sdfSymbol)) { SDF_Sort sdfSort = SDF_getSymbolSort(sdfSymbol); SDF_SymbolParameters sdfParameters = SDF_getSymbolParameters(sdfSymbol); PT_Symbols ptParameters = SDFSymbolParametersToPtSymbols(sdfParameters); char *ptSort = PT_yieldTreeToString((PT_Tree) sdfSort, ATfalse); result = PT_makeSymbolParameterizedSort(ptSort, ptParameters); } else if (SDF_isSymbolAlt(sdfSymbol)) { SDF_Symbol sdfLeft = SDF_getSymbolLeft(sdfSymbol); SDF_Symbol sdfRight = SDF_getSymbolRight(sdfSymbol); PT_Symbol ptLeft = SDFSymbolToPtSymbol(sdfLeft); PT_Symbol ptRight = SDFSymbolToPtSymbol(sdfRight); result = PT_makeSymbolAlt(ptLeft, ptRight); } else if (SDF_isSymbolCharClass(sdfSymbol)) { SDF_CharClass sdfCC = SDF_getSymbolCharClass(sdfSymbol); PT_CharRanges ptCR = SDFCharClassToPtCharRanges(sdfCC); result = PT_makeSymbolCharClass(ptCR); } else if (SDF_isSymbolLabel(sdfSymbol)) { SDF_Symbol arg = SDF_getSymbolSymbol(sdfSymbol); result = SDFSymbolToPtSymbol(arg); } else if (SDF_isSymbolStrategy(sdfSymbol)) { SDF_Symbol sdfLeft = SDF_getSymbolLeft(sdfSymbol); SDF_Symbol sdfRight = SDF_getSymbolRight(sdfSymbol); PT_Symbol ptLeft = SDFSymbolToPtSymbol(sdfLeft); PT_Symbol ptRight = SDFSymbolToPtSymbol(sdfRight); result = PT_makeSymbolStrategy(ptLeft, ptRight); } else if (SDF_isSymbolBracket(sdfSymbol)) { SDF_Symbol sym = SDF_getSymbolSymbol(sdfSymbol); result = SDFSymbolToPtSymbol(sym); } else { ATerror("SDFSymbolToPtSymbol: unable to convert symbol %t: %s\n", sdfSymbol, PT_yieldTreeToString((PT_Tree) sdfSymbol, ATfalse)); result = NULL; } return result; }