static PT_Production renameInProduction(PT_Production prod, PT_Symbol formalParam, PT_Symbol actualParam) { if (PT_isProductionDefault(prod)) { PT_Symbols lhs = PT_getProductionLhs(prod); PT_Symbol rhs = PT_getProductionRhs(prod); PT_Symbols newLhs = renameInSymbols(lhs, formalParam, actualParam); PT_Symbol newRhs = renameInSymbol(rhs, formalParam, actualParam); return PT_setProductionRhs(PT_setProductionLhs(prod, newLhs), newRhs); } else { PT_Symbol rhs = PT_getProductionRhs(prod); PT_Symbol newRhs = renameInSymbol(rhs, formalParam, actualParam); return PT_setProductionRhs(prod, newRhs); } }
static PT_Production normalizeProduction(PT_Production prod) { PT_Symbol layout = PT_makeOptLayoutSymbol(); if (!PT_isProductionList(prod)) { PT_Symbols lhs = PT_getProductionLhs(prod); PT_Symbols newLhs = PT_makeSymbolsEmpty(); PT_Symbol rhs = PT_getProductionRhs(prod); for(; !PT_isSymbolsEmpty(lhs); lhs = PT_getSymbolsTail(lhs)) { PT_Symbol head = PT_getSymbolsHead(lhs); PT_Symbol newHead; if (!PT_isSymbolLit(head)) { newHead = PT_makeSymbolCf(head); } else { newHead = head; } newLhs = PT_makeSymbolsList(newHead, newLhs); if (PT_hasSymbolsTail(PT_getSymbolsTail(lhs))) { newLhs = PT_makeSymbolsList(layout, newLhs); } } prod = PT_setProductionRhs(prod, PT_makeSymbolCf(rhs)); prod = PT_setProductionLhs(prod, PT_reverseSymbols(newLhs)); return prod; } else { return prod; } }