public static EdnToken shiftToken(ref List <EdnToken> tokens) { //EdnToken nextToken = tokens.front(); //tokens.pop_front(); EdnToken nextToken = tokens.First(); tokens.RemoveAt(0); return(nextToken); }
public static void createToken(TokenType type, int line, String value, ref List <EdnToken> tokens) { EdnToken token = new EdnToken(); token.type = type; token.line = line; token.value = value; //tokens.push_back(token); tokens.Add(token); }
public static EdnNode handleTagged(EdnToken token, EdnNode value) { EdnNode node = new EdnNode(); node.line = token.line; //String tagName = token.value.substr(1, token.value.length() - 1); String tagName = token.value.Substring(1, token.value.Length - 1); if (tagName == "_") { node.type = NodeType.EdnDiscard; } else if (tagName == "") { //special case where we return early as # { is a set - thus tagname is empty node.type = NodeType.EdnSet; if (value.type != NodeType.EdnMap) { throw new Exception("Was expection a { } after hash to build set"); } node.values = value.values; return(node); } else { node.type = NodeType.EdnTagged; } if (!validSymbol(tagName)) { throw new Exception("Invalid tag name"); } EdnToken symToken = new EdnToken(); symToken.type = TokenType.TokenAtom; symToken.line = token.line; symToken.value = tagName; List <EdnNode> values = new List <EdnNode>(); //values.push_back(handleAtom(symToken)); //values.push_back(value); values.Add(handleAtom(symToken)); node.values = values; return(node); }
public static EdnNode handleAtom(EdnToken token) { EdnNode node = new EdnNode(); node.line = token.line; node.value = token.value; if (validNil(token.value)) { node.type = NodeType.EdnNil; } else if (token.type == TokenType.TokenString) { node.type = NodeType.EdnString; } else if (validChar(token.value)) { node.type = NodeType.EdnChar; } else if (validBool(token.value)) { node.type = NodeType.EdnBool; } else if (validInt(token.value)) { node.type = NodeType.EdnInt; } else if (validFloat(token.value)) { node.type = NodeType.EdnFloat; } else if (validKeyword(token.value)) { node.type = NodeType.EdnKeyword; } else if (validSymbol(token.value)) { node.type = NodeType.EdnSymbol; } else { throw new Exception("Could not parse atom"); } return(node); }
public static EdnNode handleCollection(EdnToken token, List <EdnNode> values) { EdnNode node = new EdnNode(); node.line = token.line; node.values = values; if (token.value == "(") { node.type = NodeType.EdnList; } else if (token.value == "[") { node.type = NodeType.EdnVector; } if (token.value == "{") { node.type = NodeType.EdnMap; } return(node); }
public static EdnNode readAhead(EdnToken token, ref List <EdnToken> tokens) { if (token.type == TokenType.TokenParen) { EdnToken nextToken; List <EdnNode> L = new List <EdnNode>(); String closeParen = ""; if (token.value == "(") { closeParen = ")"; } if (token.value == "[") { closeParen = "]"; } if (token.value == "{") { closeParen = "}"; } int idx = 0; while (true) { idx++; //if (tokens.empty()) throw new Exception("unexpected end of list"); if (!tokens.Any()) { Console.WriteLine("idx " + idx); throw new Exception("unexpected end of list"); } nextToken = shiftToken(ref tokens); Console.WriteLine("idx " + idx + " " + nextToken.value); if (nextToken.value == closeParen) { return(handleCollection(token, L)); } else { L.Add(readAhead(nextToken, ref tokens)); } } } else if (token.value == ")" || token.value == "]" || token.value == "}") { throw new Exception("Unexpected " + token.value); } else { if (token.value.Length > 0 && token.value[0] == '#') { return(handleTagged(token, readAhead(shiftToken(ref tokens), ref tokens))); } else { return(handleAtom(token)); } } }