static int lengthOfSymbol(PT_Symbol symbol) { if (PT_isOptLayoutSymbol(symbol)) { return 0; } if (PT_isSymbolLit(symbol) || PT_isSymbolCilit(symbol)) { char *str = PT_getSymbolString(symbol); return strlen(str) + 2; } if (PT_isSymbolSort(symbol)) { char *str = PT_getSymbolString(symbol); return strlen(str); } if (PT_isSymbolEmpty(symbol)) { return 3; } if (PT_isSymbolSeq(symbol)) { PT_Symbols newSymbols = PT_getSymbolSymbols(symbol); return lengthOfSymbols(newSymbols) + 2; } if (PT_isSymbolOpt(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); return lengthOfSymbol(newSymbol) + 1; } if (PT_isSymbolVarSym(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); return 6 + lengthOfSymbol(newSymbol); } if (PT_isSymbolCf(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); return lengthOfSymbol(newSymbol); } if (PT_isSymbolLex(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); return 6+ lengthOfSymbol(newSymbol); } if (PT_isSymbolAlt(symbol)) { PT_Symbol leftSymbol = PT_getSymbolLhs(symbol); PT_Symbol rightSymbol = PT_getSymbolRhs(symbol); return lengthOfSymbol(leftSymbol) + 3 + lengthOfSymbol(rightSymbol); } if (PT_isSymbolTuple(symbol)) { PT_Symbol headSymbol = PT_getSymbolHead(symbol); PT_Symbols restSymbols = PT_getSymbolRest(symbol); return lengthOfSymbol(headSymbol) + 3 + lengthOfSymbols(restSymbols); } if (PT_isSymbolIterPlus(symbol) || PT_isSymbolIterStar(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); return lengthOfSymbol(newSymbol) + 1; } if (PT_isSymbolIterPlusSep(symbol) || PT_isSymbolIterStarSep(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); PT_Symbol separator = PT_getSymbolSeparator(symbol); return lengthOfSymbol(newSymbol) + lengthOfSymbol(separator) + 4; } if (PT_isSymbolIterN(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); int number = PT_getSymbolNumber(symbol); return lengthOfSymbol(newSymbol) + lengthOfInteger(number) + 1; } if (PT_isSymbolIterSepN(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); PT_Symbol separator = PT_getSymbolSeparator(symbol); int number = PT_getSymbolNumber(symbol); return lengthOfSymbol(newSymbol) + lengthOfInteger(number) + lengthOfSymbol(separator) + 4; } if (PT_isSymbolParameterizedSort(symbol)) { char *str = PT_getSymbolSort(symbol); PT_Symbols newSymbols = PT_getSymbolParameters(symbol); return lengthOfSymbols(newSymbols) + strlen(str) + 4; } if (PT_isSymbolFunc(symbol)) { PT_Symbols newSymbols = PT_getSymbolSymbols(symbol); PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); return lengthOfSymbols(newSymbols) + lengthOfSymbol(newSymbol) + 6; } if (PT_isSymbolCharClass(symbol)) { return lengthOfCharRanges(PT_getSymbolRanges(symbol)) + 2; } if (PT_isSymbolLayout(symbol)) { return 0; } ATwarning("lengthOfSymbol: unknown symbol: %t\n", symbol); return 0; }
static PT_Symbol renameInSymbol(PT_Symbol symbol, PT_Symbol formalParam, PT_Symbol actualParam) { if (PT_isEqualSymbol(symbol, formalParam)) { return actualParam; } if (PT_hasSymbolSymbols(symbol)) { PT_Symbols args = PT_getSymbolSymbols(symbol); PT_Symbols newArgs = renameInSymbols(args, formalParam, actualParam); symbol = PT_setSymbolSymbols(symbol, newArgs); } if (PT_hasSymbolParameters(symbol)) { PT_Symbols args = PT_getSymbolParameters(symbol); PT_Symbols newArgs = renameInSymbols(args, formalParam, actualParam); symbol = PT_setSymbolParameters(symbol, newArgs); } if (PT_hasSymbolSymbol(symbol)) { PT_Symbol arg = PT_getSymbolSymbol(symbol); PT_Symbol newArg = renameInSymbol(arg, formalParam, actualParam); symbol = PT_setSymbolSymbol(symbol, newArg); } if (PT_hasSymbolLhs(symbol)) { PT_Symbol arg = PT_getSymbolLhs(symbol); PT_Symbol newArg = renameInSymbol(arg, formalParam, actualParam); symbol = PT_setSymbolLhs(symbol, newArg); } if (PT_hasSymbolRhs(symbol)) { PT_Symbol arg = PT_getSymbolRhs(symbol); PT_Symbol newArg = renameInSymbol(arg, formalParam, actualParam); symbol = PT_setSymbolRhs(symbol, newArg); } if (PT_hasSymbolHead(symbol)) { PT_Symbol arg = PT_getSymbolHead(symbol); PT_Symbol newArg = renameInSymbol(arg, formalParam, actualParam); symbol = PT_setSymbolHead(symbol, newArg); } if (PT_hasSymbolRest(symbol)) { PT_Symbols args = PT_getSymbolRest(symbol); PT_Symbols newArgs = renameInSymbols(args, formalParam, actualParam); symbol = PT_setSymbolRest(symbol, newArgs); } if (PT_hasSymbolSeparator(symbol)) { PT_Symbol arg = PT_getSymbolSeparator(symbol); PT_Symbol newArg = renameInSymbol(arg, formalParam, actualParam); symbol = PT_setSymbolSeparator(symbol, newArg); } return symbol; }
static int yieldSymbol(PT_Symbol symbol, int idx, char *buf, int bufSize) { int i; assert(idx <= bufSize); if (PT_isOptLayoutSymbol(symbol)) { return idx; } if (PT_isSymbolLit(symbol) || PT_isSymbolCilit(symbol)) { ATbool ci = PT_isSymbolCilit(symbol); char *str = PT_getSymbolString(symbol); int len = strlen(str); buf[idx++] = ci ? '\'' : '"'; for (i = 0; i < len; i++) { buf[idx++] = str[i]; } buf[idx++] = ci ? '\'' : '"'; return idx; } if (PT_isSymbolSort(symbol)) { char *str = PT_getSymbolString(symbol); int len = strlen(str); for (i = 0; i < len; i++) { buf[idx++] = str[i]; } return idx; } if (PT_isSymbolEmpty(symbol)) { buf[idx++] = '('; buf[idx++] = ' '; buf[idx++] = ')'; return idx; } if (PT_isSymbolSeq(symbol)) { PT_Symbols newSymbols = PT_getSymbolSymbols(symbol); buf[idx++] = '('; idx = yieldSymbols(newSymbols, idx, buf, bufSize); buf[idx++] = ')'; return idx; } if (PT_isSymbolOpt(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); idx = yieldSymbol(newSymbol, idx, buf, bufSize); buf[idx++] = '?'; return idx; } if (PT_isSymbolVarSym(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); buf[idx++] = '<'; idx = yieldSymbol(newSymbol, idx, buf, bufSize); buf[idx++] = '-'; buf[idx++] = 'V'; buf[idx++] = 'A'; buf[idx++] = 'R'; buf[idx++] = '>'; return idx; } if (PT_isSymbolCf(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); idx = yieldSymbol(newSymbol, idx, buf, bufSize); return idx; } if (PT_isSymbolLex(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); buf[idx++] = '<'; idx = yieldSymbol(newSymbol, idx, buf, bufSize); buf[idx++] = '-'; buf[idx++] = 'L'; buf[idx++] = 'E'; buf[idx++] = 'X'; buf[idx++] = '>'; return idx; } if (PT_isSymbolAlt(symbol)) { PT_Symbol leftSymbol = PT_getSymbolLhs(symbol); PT_Symbol rightSymbol = PT_getSymbolRhs(symbol); idx = yieldSymbol(leftSymbol, idx, buf, bufSize); buf[idx++] = ' '; buf[idx++] = '|'; buf[idx++] = ' '; idx = yieldSymbol(rightSymbol, idx, buf, bufSize); return idx; } if (PT_isSymbolTuple(symbol)) { PT_Symbol headSymbol = PT_getSymbolHead(symbol); PT_Symbols restSymbols = PT_getSymbolRest(symbol); buf[idx++] = '<'; idx = yieldSymbol(headSymbol, idx, buf, bufSize); buf[idx++] = ','; idx = yieldSymbolParameters(restSymbols, idx, buf, bufSize); buf[idx++] = '>'; return idx; } if (PT_isSymbolIterPlus(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); idx = yieldSymbol(newSymbol, idx, buf, bufSize); buf[idx++] = '+'; return idx; } if (PT_isSymbolIterStar(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); idx = yieldSymbol(newSymbol, idx, buf, bufSize); buf[idx++] = '*'; return idx; } if (PT_isSymbolIterPlusSep(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); PT_Symbol separator = PT_getSymbolSeparator(symbol); buf[idx++] = '{'; idx = yieldSymbol(newSymbol, idx, buf, bufSize); buf[idx++] = ' '; idx = yieldSymbol(separator, idx, buf, bufSize); buf[idx++] = '}'; buf[idx++] = '+'; return idx; } if (PT_isSymbolIterStarSep(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); PT_Symbol separator = PT_getSymbolSeparator(symbol); buf[idx++] = '{'; idx = yieldSymbol(newSymbol, idx, buf, bufSize); buf[idx++] = ' '; idx = yieldSymbol(separator, idx, buf, bufSize); buf[idx++] = '}'; buf[idx++] = '*'; return idx; } if (PT_isSymbolIterN(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); int number = PT_getSymbolNumber(symbol); idx = yieldSymbol(newSymbol, idx, buf, bufSize); idx = yieldInteger(number, idx, buf, bufSize); buf[idx++] = '+'; return idx; } if (PT_isSymbolIterSepN(symbol)) { PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); PT_Symbol separator = PT_getSymbolSeparator(symbol); int number = PT_getSymbolNumber(symbol); buf[idx++] = '{'; idx = yieldSymbol(newSymbol, idx, buf, bufSize); buf[idx++] = ' '; idx = yieldSymbol(separator, idx, buf, bufSize); buf[idx++] = '}'; idx = yieldInteger(number, idx, buf, bufSize); buf[idx++] = '+'; return idx; } if (PT_isSymbolParameterizedSort(symbol)) { char *str = PT_getSymbolSort(symbol); PT_Symbols newSymbols = PT_getSymbolParameters(symbol); int len = strlen(str); for (i = 0; i < len; i++) { buf[idx++] = str[i]; } buf[idx++] = '['; buf[idx++] = '['; idx = yieldSymbolParameters(newSymbols, idx, buf, bufSize); buf[idx++] = ']'; buf[idx++] = ']'; return idx; } if (PT_isSymbolFunc(symbol)) { PT_Symbols newSymbols = PT_getSymbolSymbols(symbol); PT_Symbol newSymbol = PT_getSymbolSymbol(symbol); buf[idx++] = '('; idx = yieldSymbols(newSymbols, idx, buf, bufSize); buf[idx++] = ' '; buf[idx++] = '='; buf[idx++] = '>'; buf[idx++] = ' '; idx = yieldSymbol(newSymbol, idx, buf, bufSize); buf[idx++] = ')'; return idx; } if (PT_isSymbolCharClass(symbol)) { PT_CharRanges charRanges = PT_getSymbolRanges(symbol); buf[idx++] = '['; idx = yieldCharRanges(charRanges,idx,buf,bufSize); buf[idx++] = ']'; return idx; } if (PT_isSymbolLayout(symbol)) { return idx; } ATwarning("yieldSymbol: unknown symbol: %t\n", symbol); return idx; }