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); }
PT_Tree PT_makeTreeLexToCf(PT_Symbol sym, PT_Tree tree) { PT_Symbol lexSymbol = PT_makeSymbolLex(sym); PT_Symbol cfSymbol = PT_makeSymbolCf(sym); PT_Symbols lhs = PT_makeSymbolsSingle(lexSymbol); PT_Attributes noattrs = PT_makeAttributesNoAttrs(); PT_Production prod = PT_makeProductionDefault(lhs, cfSymbol, noattrs); PT_Args args = PT_makeArgsSingle(tree); return PT_makeTreeAppl(prod, args); }
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); }
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; } }
PT_Tree PT_makeTreeFlatLexical(PT_Args charList) { return PT_makeTreeAppl(PT_makeProductionList(makeSymbolAllChars()), charList); }