PT_Tree PT_makeTreeLit(const char* string) { int len = strlen(string); int i; PT_Args args = PT_makeArgsEmpty(); PT_Symbols symbols = PT_makeSymbolsEmpty(); PT_Symbol symbol = PT_makeSymbolLit(string); PT_Attributes attrs = PT_makeAttributesNoAttrs(); PT_Production prod; for (i = len - 1; i >= 0; i--) { PT_Tree arg; PT_Symbol symbol; arg = PT_makeTreeChar(string[i]); args = PT_makeArgsMany(arg, args); symbol = PT_makeSymbolCharClass( PT_makeCharRangesSingle( PT_makeCharRangeCharacter(string[i]))); symbols = PT_makeSymbolsMany(symbol, symbols); } prod = PT_makeProductionDefault(symbols, symbol, attrs); return PT_makeTreeAppl(prod, args); }
static PT_ParseTree applyFunction(const char *function, const char *sort, int nInputs, PT_ParseTree inputs[MAX_ARGS]) { PT_Args args = PT_makeArgsEmpty(); for (--nInputs; nInputs >= 0; nInputs--) { PT_Tree parseTree = PT_getParseTreeTree(inputs[nInputs]); args = PT_makeArgsMany(parseTree, args); } return PT_applyFunctionToArgsParseTree(function, sort, args); }
static PT_Args flattenArgsAgain(PT_Args args) { PT_Args newArgs = PT_makeArgsEmpty(); for ( ; !PT_isArgsEmpty(args); args = PT_getArgsTail(args)) { PT_Tree arg = PT_getArgsHead(args); newArgs = PT_makeArgsMany(flattenTreeAgain(arg), newArgs); } return PT_reverseArgs(newArgs); }
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); }
PT_Tree PT_makeTreeCilit(const char* string) { int len = strlen(string); int i; PT_Args args = PT_makeArgsEmpty(); PT_Symbols symbols = PT_makeSymbolsEmpty(); PT_Symbol symbol = PT_makeSymbolCilit(string); PT_Attributes attrs = PT_makeAttributesNoAttrs(); PT_Production prod; for (i = len - 1; i >= 0; i--) { PT_Tree arg; PT_Symbol symbol; arg = PT_makeTreeChar(string[i]); args = PT_makeArgsMany(arg, args); if (string[i] >= 'A' && string[i] <= 'Z') { PT_CharRanges range1 = PT_makeCharRangesSingle( PT_makeCharRangeCharacter(string[i])); PT_CharRanges range2 = PT_makeCharRangesSingle( PT_makeCharRangeCharacter(string[i]+ ('a' - 'A'))); symbol = PT_makeSymbolCharClass(PT_concatCharRanges(range1,range2)); } else if (string[i] >= 'a' && string[i] <= 'z') { PT_CharRanges range1 = PT_makeCharRangesSingle( PT_makeCharRangeCharacter(string[i])); PT_CharRanges range2 = PT_makeCharRangesSingle( PT_makeCharRangeCharacter(string[i]- ('a' - 'A'))); symbol = PT_makeSymbolCharClass(PT_concatCharRanges(range2,range1)); } else { symbol = PT_makeSymbolCharClass( PT_makeCharRangesSingle( PT_makeCharRangeCharacter(string[i]))); } symbols = PT_makeSymbolsMany(symbol, symbols); } prod = PT_makeProductionDefault(symbols, symbol, attrs); return PT_makeTreeAppl(prod, args); }
static PT_Tree listToTree(PT_Production prod, ATermList elems) { PT_Tree layout = defaultLayout; PT_Tree sepTree = NULL; PT_Symbol rhs; PT_Args args = PT_makeArgsEmpty(); ATbool contextfree; int sepLength = 0; int i; rhs = PT_getProductionRhs(prod); if (PT_isSymbolCf(rhs)) { rhs = PT_getSymbolSymbol(rhs); contextfree = ATtrue; } else if (PT_isSymbolLex(rhs)) { rhs = PT_getSymbolSymbol(rhs); contextfree = ATfalse; } else { contextfree = ATfalse; } if (PT_hasSymbolSeparator(rhs)) { PT_Symbol sepSym = PT_getSymbolSeparator(rhs); assert(PT_isSymbolLit(sepSym)); sepTree = PT_makeTreeLit(PT_getSymbolString(sepSym)); sepLength = contextfree ? 3 : 1; } if (!ATisEmpty(elems)) { /* get a free part of the term store */ TERM_STORE_FRAME(ATgetLength(elems), for (i = 0; !ATisEmpty(elems); elems = ATgetNext(elems)) { PT_Tree newTree = termToTree(ATgetFirst(elems)); /* Note that TERM_STORE contains a reference to a global * that may be updated by termToTree, so do not remove the * newTree temporary variable and do not inline the call to termToTree * in the following assignment. */ TERM_STORE_CHECK(i); TERM_STORE[i] = (ATerm) newTree; i++; } while(--i >= 0) { args = PT_makeArgsMany((PT_Tree) TERM_STORE[i], args); if (i != 0) { if (sepTree) { if (!keep_layout && contextfree) { args = PT_makeArgsMany(layout, args); } if (!keep_layout) { args = PT_makeArgsMany(sepTree, args); } } if (!keep_layout && contextfree) { args = PT_makeArgsMany(layout, args); } } } ) }