Esempio n. 1
0
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;
}
Esempio n. 2
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;
}
Esempio n. 3
0
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;
}