Пример #1
0
/* Given an itemset find the productions or symbols that will label the edges 
 * leaving the state containing the given itemset. Specifically: 
 * - For items of the form (\cdot \alpha -> X) add that item's production 
 *   number to predprods.
 * - For items of the form (\alpha \cdot A \beta -> X) add A to predchars, 
 *   where can be a terminal or a non-terminal encoded as a char-class. */
void outgoing(ItemSet itemset, ATermList *predprods, CC_Set *predchars) {
  Item item;
  PT_Symbol symbol;
  ItemSetIterator iter;

  *predprods = ATempty;

  ITS_iterator(itemset, &iter);
  while (ITS_hasNext(&iter)) {
    item = ITS_next(&iter);
    
    if (IT_getDotPosition(item) == 0) {
      ATerm prod = (ATerm)ATmakeInt(IT_getProdNr(item));
      /*assert(ATindexOf(*predprods, prod, 0) == -1);*/
      *predprods = ATinsert(*predprods, prod);
    }

    symbol = (PT_Symbol)IT_getDotSymbol(item);
    
    if (PT_isSymbolCharClass(symbol)) {
      CC_addPTSymbolToClass(CC_addToSet(predchars), symbol);
    }
  }
}
Пример #2
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;
}
Пример #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;
}