示例#1
0
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;

}
示例#2
0
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);
}