PT_Symbols PT_foreachSymbolInSymbols(PT_Symbols symbols, PT_SymbolVisitor visitor, PT_SymbolVisitorData data) { ATermList store; PT_Symbols newSymbols = PT_makeSymbolsEmpty(); /* apply func to each element */ store = ATempty; while (PT_hasSymbolsHead(symbols)) { store = ATinsert(store, PT_SymbolToTerm( visitor(PT_getSymbolsHead(symbols), data))); if (PT_hasSymbolsTail(symbols)) { symbols = PT_getSymbolsTail(symbols); } else { break; } } /* create new list */ for (; !ATisEmpty(store); store = ATgetNext(store)) { PT_Symbol newSymbol = PT_SymbolFromTerm(ATgetFirst(store)); newSymbols = PT_makeSymbolsList(newSymbol,newSymbols); } return newSymbols; }
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_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_Symbols SDFSymbolRestToPtSymbols(SDF_SymbolRest sdfSymbols) { PT_Symbols ptSymbols = PT_makeSymbolsEmpty(); while (SDF_hasSymbolRestHead(sdfSymbols)) { SDF_Symbol sdfSymbol = SDF_getSymbolRestHead(sdfSymbols); PT_Symbol ptSymbol = SDFSymbolToPtSymbol(sdfSymbol); ptSymbols = PT_appendSymbols(ptSymbols, ptSymbol); if (SDF_isSymbolRestSingle(sdfSymbols)) { break; } sdfSymbols = SDF_getSymbolRestTail(sdfSymbols); } return ptSymbols; }
static PT_Production normalizeProduction(PT_Production prod) { PT_Symbol layout = PT_makeOptLayoutSymbol(); if (!PT_isProductionList(prod)) { PT_Symbols lhs = PT_getProductionLhs(prod); PT_Symbols newLhs = PT_makeSymbolsEmpty(); PT_Symbol rhs = PT_getProductionRhs(prod); for(; !PT_isSymbolsEmpty(lhs); lhs = PT_getSymbolsTail(lhs)) { PT_Symbol head = PT_getSymbolsHead(lhs); PT_Symbol newHead; if (!PT_isSymbolLit(head)) { newHead = PT_makeSymbolCf(head); } else { newHead = head; } newLhs = PT_makeSymbolsList(newHead, newLhs); if (PT_hasSymbolsTail(PT_getSymbolsTail(lhs))) { newLhs = PT_makeSymbolsList(layout, newLhs); } } prod = PT_setProductionRhs(prod, PT_makeSymbolCf(rhs)); prod = PT_setProductionLhs(prod, PT_reverseSymbols(newLhs)); return prod; } else { return prod; } }