Beispiel #1
0
        public static EdnToken shiftToken(ref List <EdnToken> tokens)
        {
            //EdnToken nextToken = tokens.front();
            //tokens.pop_front();

            EdnToken nextToken = tokens.First();

            tokens.RemoveAt(0);
            return(nextToken);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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));
                }
            }
        }