Ejemplo n.º 1
0
JLDString* JLDIO::parseString(std::istringstream& iss)
{
    ignoreWhiteSpace(iss);
    char charBuffer, matchedChar;
    iss.get(charBuffer);
    assert((charBuffer == '\'' || charBuffer == '"') && "Input is not a string");
    matchedChar = charBuffer;
    std::string text = "";
    iss.get(charBuffer);
    while(charBuffer != matchedChar)
    {
        text += charBuffer;
        iss.get(charBuffer);
        if(!iss.good())
        {
            assert(0 && "No matching quote for a string");
            break;
        }
    }
    ignoreWhiteSpace(iss);
    if(iss.peek() == '+')
    {
        iss.get(charBuffer);
        auto concatObj = parseString(iss);
        text += concatObj->getValue();
        delete concatObj;
    }
    // std::cout<<"parseString found: '"<<text<<"'\n";
    // std::cout<<"Cursor now on: '"<<(char)iss.peek()<<"'\n";
    return new JLDString(text);
}
Ejemplo n.º 2
0
JLDDoc* JLDIO::parseDoc(std::istringstream& iss)
{
    ignoreWhiteSpace(iss);
    char charBuffer;
    iss.get(charBuffer);
    assert(charBuffer == '{' && "Input is not a doc");
    JLDDoc* out = new JLDDoc();
    // empty list
    ignoreWhiteSpace(iss);
    if(iss.peek() == '}')
    {
        iss.get(charBuffer);
        return out;
    }
    do
    {
        auto keyObj = parseString(iss);
        std::string key = keyObj->getValue();
        delete keyObj;
        ignoreWhiteSpace(iss);
        assert(iss.peek() == ':' && ": expected after a keyword");
        iss.get(charBuffer);
        ignoreWhiteSpace(iss);
        JLDData* valueObj;
        switch (iss.peek())
        {
        case '{':
            valueObj = parseDoc(iss);
            break;
        case '[':
            valueObj = parseList(iss);
            break;
        case '\'':
        case '\"':
            valueObj = parseString(iss);
            break;
        default:
            assert(0 && "Unexpected value");
            break;
        }
        out->push_back(key, valueObj);
    } while(moreItems(iss, '}'));
    iss.get(charBuffer);
    return out;
}
Ejemplo n.º 3
0
JLDList* JLDIO::parseList(std::istringstream& iss)
{
    ignoreWhiteSpace(iss);
    char charBuffer;
    iss.get(charBuffer);
    assert(charBuffer == '[' && "Input is not a list");
    JLDList* out = new JLDList();
    // empty list
    ignoreWhiteSpace(iss);
    if(iss.peek() == ']')
    {
        iss.get(charBuffer);
        return out;
    }
    do
    {
        ignoreWhiteSpace(iss);
        JLDData* valueObj;
        switch (iss.peek())
        {
        case '{':
            valueObj = parseDoc(iss);
            break;
        case '[':
            valueObj = parseList(iss);
            break;
        case '\'':
        case '\"':
            valueObj = parseString(iss);
            break;
        default:
            assert(0 && "Unexpected value");
            break;
        }
        out->push_back(valueObj);
    } while(moreItems(iss, ']'));
    iss.get(charBuffer);
    return out;
}
Ejemplo n.º 4
0
bool JLDIO::moreItems(std::istringstream& iss, char delim)
{
    char charBuffer;
    ignoreWhiteSpace(iss);
    if(iss.peek() == ',')
    {
        iss.get(charBuffer);
        return true;
    }
    else if(iss.peek() != delim)
    {
        std::cout<<"Expected '"<<delim<<"' but found '"<<(char)iss.peek()<<"'\n";
        assert(0 && "Unexpected char");
    }
    return false;
}
Ejemplo n.º 5
0
int
readNextToken(char **t, int *tlen, int (*get_next_byte) (void *),
              void *get_next_byte_argument)
{
  char c;
  char *token;
  int len = 0;
  int maxLen = BUF_SIZE;
  TOKENTYPE type = NOT_DEFINED;

  if (*tlen) {
    len = strlen(*t);
    token = *t;
    maxLen = *tlen;
  } else {
    token = malloc(BUF_SIZE);
    len = 0;
    maxLen = BUF_SIZE;
  }

  ignoreWhiteSpace(get_next_byte, get_next_byte_argument);

  while ((c = get_next_byte(get_next_byte_argument)) != EOF) {
    type = getTokenType(c);
    if (type == ALPHANUM) {
      if (c == '`') {
	backquote = !backquote;
      }
      token[len++] = c;
      if (len + 1 == maxLen) {
      	maxLen *= 2;
      	token = realloc(token, maxLen);
      }
    } else if (type == SPACE) {
      int val;
      while ((c = get_next_byte(get_next_byte_argument)) != EOF && c == ' ') {
	;
      }
      val = getTokenType(c);
      if (val == ALPHANUM || val == O_PAR || val == PIPE) {
	_rewind(get_next_byte_argument, -1);
      } else if (val == REDIRECTION1 || val == REDIRECTION2) {
	_rewind(get_next_byte_argument, -1);
	type = val;
      } else {
	type = val;
      }
      break;
    } else if (type == O_PAR) {
        *t = token;
        *tlen += 1;
        return type;
    } else if (type == REDIRECTION1 || type == REDIRECTION2) {
      _rewind(get_next_byte_argument, -1);
      break;
    } else {
      break;
    }
  }
  /* if (len == 0) { */
  /*   *t = NULL; */
  /*   free(token); */
  /* } else { */
    token[len] = '\0';
    *t = token;
    *tlen = maxLen;
    //  }
  return type;
}