コード例 #1
0
PT_Tree CO_getFunctionArgument(PT_Tree function, int i)
{
  /* "name" L "(" L <arg0> L "," L <arg1> L "," L <arg2> L  ... */
  /* |-----4------| |------4-----| |-----4------| |-------- ... */

  return PT_getArgsArgumentAt(PT_getTreeArgs(function),4 + 4 * i);
}
コード例 #2
0
ファイル: MEPT-utils.c プロジェクト: codyhanson/sdfmetz
PT_Tree PT_getTreeBracketTree(PT_Tree tree)
{
  if (PT_isTreeBracket(tree)) {
    return PT_getArgsArgumentAt(PT_getTreeArgs(tree),2);
  }
  return NULL;
}
コード例 #3
0
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));
}
コード例 #4
0
PT_Tree PT_findTreeParentRecursive(PT_Tree needle, PT_Tree haystack)
{
  assert(needle != NULL);
  assert(haystack != NULL);
  assert(needle != haystack);

  if (ATtableGet(findParentCache, PT_TreeToTerm(haystack)) != NULL) {
	  return NULL;
  }

  if (PT_hasTreeArgs(haystack)) {
    PT_Args children = PT_getTreeArgs(haystack);
    while (!PT_isArgsEmpty(children)) {
      PT_Tree child = PT_getArgsHead(children);
      if (PT_isEqualTree(child, needle)) {
	return haystack;
      }
      else {
	PT_Tree suspect = PT_findTreeParentRecursive(needle, child);
	if (suspect != NULL) {
	  return suspect;
	}
      }
      children = PT_getArgsTail(children);
    }
  }

  ATtablePut(findParentCache, PT_TreeToTerm(haystack), PT_TreeToTerm(NeedleNotHere));
  return NULL;
}
コード例 #5
0
ATbool PT_containsTreeCycle(PT_Tree tree) {
  if (PT_isTreeCycle(tree)) {
    return ATtrue;
  }

  if (PT_hasTreeArgs(tree)) {
    return PT_containsArgsCycle(PT_getTreeArgs(tree));
  }

  return ATfalse;
}
コード例 #6
0
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;
}
コード例 #7
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);
}
コード例 #8
0
ファイル: symbol-renaming.c プロジェクト: codyhanson/sdfmetz
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;
  }
}
コード例 #9
0
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;
}
コード例 #10
0
static PT_Tree get_lex_term_anno(PT_Tree term, PT_Tree key)
{
  ATerm label;
  ATerm anno = NULL;

  label = unquoteAppl(ATparse(PT_yieldTreeToString(key, ATfalse)));

  if (label == NULL) {
    return NULL;
  }

  if (PT_isTreeLexicalInjection(term)) {
    PT_Tree lex = PT_getArgsHead(PT_getTreeArgs(term));
    anno = PT_getTreeAnnotation(lex, label);
  }

  if (anno != NULL) {
    return (PT_Tree) PTPT_liftATerm(anno);
  }

  return noAnno();
}
コード例 #11
0
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;
  }
}
コード例 #12
0
static PT_Tree pAmb(PT_Tree tree, int *i) 
{
  PT_Args args = PT_getTreeArgs(tree);
  return PT_setTreeArgs(tree, pArgs(args, i));
}