static PT_Tree pList(PT_Tree tree, int *i, SDF_Symbol ssym) { PT_Tree layout; PT_Args elems; PT_Args newElems; ATbool isLayout; int indent = *i; assert(PT_isTreeApplList(tree) && "This tool only supports AsFix2ME"); assert(SDF_isSymbolIterStar(ssym) || SDF_isSymbolIter(ssym)); layout = (PT_Tree) SDF_getSymbolWsAfterSymbol(ssym); elems = PT_getTreeArgs(tree); newElems = PT_makeArgsEmpty(); isLayout = ATfalse; for (; !PT_isArgsEmpty(elems); elems = PT_getArgsTail(elems)) { PT_Tree head = PT_getArgsHead(elems); if (isLayout) { newElems = PT_makeArgsList(createLayoutTree(*i, layout), newElems); *i = calcIndentationLevel(*i, layout); } else { newElems = PT_makeArgsList(pTree(head, i), newElems); } isLayout = !isLayout; *i = indent; } return PT_setTreeArgs(tree, PT_reverseArgs(newElems)); }
static PT_Tree pAppl(PT_Tree tree, int *i) { int indent = *i; PT_Args args = PT_getTreeArgs(tree); PT_Production prod = PT_getTreeProd(tree); SDF_Production sprod = (SDF_Production) ATtableGet(mapping, (ATerm) prod); if (sprod != NULL) { PT_Args newArgs = PT_makeArgsEmpty(); SDF_SymbolList slhs = SDF_getSymbolsList(SDF_getProductionSymbols(sprod)); PT_Symbols lhs = PT_getProductionLhs(prod); PT_Tree nextLayout = NULL; for (; !PT_isArgsEmpty(args); args = PT_getArgsTail(args), lhs = PT_getSymbolsTail(lhs)) { PT_Tree head = PT_getArgsHead(args); PT_Symbol sym = PT_getSymbolsHead(lhs); // here we put in the layout that's in between the symbols on the lhs if (PT_isOptLayoutSymbol(sym)) { assert(nextLayout != NULL); newArgs = PT_makeArgsList(createLayoutTree(indent, nextLayout), newArgs); *i = calcIndentationLevel(indent, nextLayout); nextLayout = NULL; } else { SDF_Symbol ssym = SDF_getSymbolListHead(slhs); PT_Symbol real = PT_getSymbolSymbol(sym); newArgs = PT_makeArgsList(pTreeWithSymbol(head, i, real, ssym), newArgs); if (SDF_hasSymbolListTail(slhs)) { nextLayout = (PT_Tree) SDF_getSymbolListWsAfterFirst(slhs); slhs = SDF_getSymbolListTail(slhs); } } } tree = PT_setTreeArgs(tree, PT_reverseArgs(newArgs)); } else { tree = PT_setTreeArgs(tree, pArgs(args, i)); } return tree; }
static PT_Tree flattenTreeAgain(PT_Tree tree) { if (PT_isTreeAppl(tree)) { PT_Production prod = PT_getTreeProd(tree); PT_Args args = PT_getTreeArgs(tree); args = flattenArgsAgain(args); if (PT_isProductionList(prod)) { args = flattenListAgain(prod, args); } return PT_setTreeArgs(tree, args); } else if (PT_isTreeAmb(tree)) { PT_Args ambs = PT_getTreeArgs(tree); ambs = flattenArgsAgain(ambs); return PT_setTreeArgs(tree, ambs); } return tree; }
PT_Tree PT_renameInTree(PT_Tree tree, PT_Symbol formalParam, PT_Symbol actualParam) { if (PT_isTreeAppl(tree)) { PT_Production prod = PT_getTreeProd(tree); PT_Symbol rhs = PT_getProductionRhs(prod); PT_Args args = PT_getTreeArgs(tree); PT_Production newProd = renameInProduction(prod, formalParam, actualParam); PT_Symbol newRhs = PT_getProductionRhs(newProd); PT_Args newArgs = renameInArgs(args, formalParam, actualParam); PT_Tree newTree; newTree = PT_setTreeArgs(PT_setTreeProd(tree, newProd), newArgs); /* Wrap new variable lists in a proper list production */ if (PT_isTreeVar(newTree) && (PT_isIterSymbol(newRhs) || PT_isIterSepSymbol(newRhs)) && !(PT_isIterSymbol(rhs) || PT_isIterSepSymbol(rhs))) { PT_Production listProd = PT_makeProductionList(newRhs); PT_Tree listTree = PT_makeTreeAppl(listProd, PT_makeArgsList(newTree, PT_makeArgsEmpty())); newTree = listTree; } return newTree; } else if (PT_isTreeLit(tree)) { if (PT_isSymbolLit(formalParam)) { char *localStr = PT_getTreeString(tree); char *formalStr = PT_getSymbolString(formalParam); if (strcmp(localStr, formalStr) == 0) { return PT_setTreeString(tree, PT_getSymbolString(actualParam)); } } return tree; } else { return tree; } }
static PT_Tree pTreeWithSymbol(PT_Tree tree, int *i, PT_Symbol sym, SDF_Symbol ssym) { if (PT_isSymbolSort(sym)) { return pTree(tree, i); } else if (PT_isSymbolLit(sym)) { return tree; } else if (PT_isSymbolIterStar(sym) || PT_isSymbolIterPlus(sym)) { return pList(tree, i, ssym); } else if (PT_isSymbolIterStarSep(sym) || PT_isSymbolIterPlusSep(sym)) { return pSepList(tree, i, ssym); } /* the rest is handled by doing nothing */ if (PT_hasTreeArgs(tree)) { return PT_setTreeArgs(tree, pArgs(PT_getTreeArgs(tree), i)); } else { return tree; } }
static PT_Tree pAmb(PT_Tree tree, int *i) { PT_Args args = PT_getTreeArgs(tree); return PT_setTreeArgs(tree, pArgs(args, i)); }