static PT_Tree toText(PT_ParseTree parseTree) { PT_Tree tree = addBoxToTextFunction(parseTree); PT_Production func = PT_getTreeProd(tree); ATerm reduct = innermost(tree); PT_Tree result = toasfixNoLayout(reduct); if (result == NULL) { ERR_managerStoreError( "Could not format Box expression (unexpected behavior)", ERR_makeSubjectListEmpty()); return NULL; } else if (PT_isTreeAppl(result) && PT_isEqualProduction(PT_getTreeProd(result), func)) { FILE *fp = NULL; ERR_managerStoreLocatedError( "Could not format Box expression for unknown reasons", "Box expression", "./debug.box",1,0,1,0,0,1); fp = fopen("./debug.box", "wb"); if (fp != NULL) { PT_yieldParseTreeToFile(parseTree, fp, ATfalse); fclose(fp); } return NULL; } return result; }
static PT_Args flattenListAgain(PT_Production prod, PT_Args elems) { PT_Args newElems = PT_makeArgsEmpty(); for ( ; !PT_isArgsEmpty(elems); elems = PT_getArgsTail(elems)) { PT_Tree arg = PT_getArgsHead(elems); if (PT_hasTreeProd(arg)) { ATbool nested = ATfalse; PT_Production argProd = PT_getTreeProd(arg); if (PT_isEqualProduction(prod, argProd)) { nested = ATtrue; } else if (PT_isProductionList(argProd)) { PT_Symbol rhs = PT_getProductionRhs(prod); PT_Symbol rhsArg = PT_getProductionRhs(argProd); if (PT_isSymbolCf(rhs) || PT_isSymbolLex(rhs)) { rhs = PT_getSymbolSymbol(rhs); } if (PT_isSymbolCf(rhsArg) || PT_isSymbolLex(rhsArg)) { rhsArg = PT_getSymbolSymbol(rhsArg); } if (PT_isSymbolIterStar(rhs) && PT_isSymbolIterPlus(rhsArg) && PT_isEqualSymbol(PT_getSymbolSymbol(rhs), PT_getSymbolSymbol(rhsArg))) { nested = ATtrue; } } if (nested) { PT_Args nestedElems = PT_getTreeArgs(arg); newElems = PT_concatArgs(PT_reverseArgs(nestedElems), newElems); continue; } } newElems = PT_makeArgsMany(arg, newElems); } return PT_reverseArgs(newElems); }