Beispiel #1
0
  std::string SymbolTable::ReplaceStringFrom(std::string src, std::string const& from)
  {
    size_t pos = from.find('$');
    if (std::string::npos == pos)
    {
      return src;
    }

    char const* dollarSign = from.c_str() + pos;
    int length = lengthOfSymbol(dollarSign + 1);
    std::string symbol(dollarSign, length + 1);
    try
    {
      std::string symbolValue = GetValue(dollarSign + 1, length);
      boost::algorithm::replace_all(src
        , symbol
        , symbolValue);
      return ReplaceStringFrom(src, src);
    }
    catch (std::exception const&)
    {
      // eat exception.
    }

    // We are running out of data.
    if (from.size() == (pos + 1))
    {
      return src;
    }

    return ReplaceStringFrom(src, dollarSign + 1);
  }
Beispiel #2
0
static char* replaceStringFrom(SymbolTable* symbolTable, const char* string, const char* from) {
	char * dollarSign = strpbrk(from, "$");
	if (dollarSign)
	{
		int length = lengthOfSymbol(dollarSign + 1);
		const char * symbolValue = SymbolTable_FindSymbol(symbolTable, dollarSign + 1, length);
		if (symbolValue)
		{
			int valueLength = strlen(symbolValue);
			int bufferLength = strlen(string)+valueLength-(length+1) + 1;
			char * newString = malloc(bufferLength);
			memset(newString, 0, bufferLength);
			strncat(newString, string, (dollarSign - string));
			strcat(newString, symbolValue);
			strcat(newString, dollarSign + 1 + length);

			assert(bufferLength == strlen(newString) + 1);

			char* recursedString = replaceStringFrom(symbolTable, newString, newString);
			free(newString);
			return recursedString;
		}
		else
		{
			if (*(dollarSign+1) == 0)
				return buyString(string);
				
			return replaceStringFrom(symbolTable, string, dollarSign+1);
		}
	}
	return buyString(string);
}
Beispiel #3
0
static int  
lengthOfProd(PT_Production prod)
{
  PT_Symbol rhs = PT_getProductionRhs(prod);

  if (PT_isProductionList(prod)) {
    return lengthOfSymbol(rhs); 
  }
  else {
    PT_Symbols lhs = PT_getProductionLhs(prod);
    PT_Attributes attrs = PT_getProductionAttributes(prod);

    return lengthOfSymbols(lhs) + 4 +
	   lengthOfSymbol(rhs) +
	   lengthOfAttributes(attrs);
  }
}
Beispiel #4
0
static int lengthOfSymbols(PT_Symbols symbols)
{
  int length = 0;

  while (PT_hasSymbolsHead(symbols)) {
    length = length + lengthOfSymbol(PT_getSymbolsHead(symbols)) + 1;
    symbols = PT_getSymbolsTail(symbols);
  }

  return length;
}
Beispiel #5
0
char *PT_yieldSymbol(PT_Symbol symbol) {
  static char *buffer = NULL;
  static int   bufferSize = 0;
  int          idx = 0;
  int          len;

  len = lengthOfSymbol(symbol) + 1;

  if (len > bufferSize) {
    buffer = (char *)realloc(buffer, len*sizeof(char));
    bufferSize = len;
  }

  idx = yieldSymbol(symbol, idx, buffer, len);

  assert(idx <= len); 
  buffer[idx++] = '\0';

  return buffer;
}
Beispiel #6
0
char *PT_yieldSymbolVisualVariables(PT_Symbol symbol) {
  static char *buffer = NULL;
  static int   bufferSize = 0;
  int          idx = 0;
  int          len;

  len = strlen(VARIABLE " ") + lengthOfSymbol(symbol) + 1;

  if (len > bufferSize) {
    buffer = (char *)realloc(buffer, len*sizeof(char));
    bufferSize = len;
  }

  strcpy(buffer, VARIABLE " ");
  idx = strlen(VARIABLE " ");
  idx = yieldSymbol(symbol, idx, buffer, len);

  assert(idx <= len); 
  buffer[idx++] = '\0';

  return buffer;
}                                
Beispiel #7
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;
}