Example #1
0
        public static LinkedListNode <Lexeme> TryParse(LinkedListNode <Lexeme> lexemes, out Expr resultNode)
        {
            resultNode = null;
            var nextLexeme = UnaryExpr.TryParse(lexemes, out UnaryExpr pre);

            if (pre != null)
            {
                resultNode = pre;
                return(nextLexeme);
            }

            nextLexeme = ArrayInitializer.TryParse(nextLexeme, out ArrayInitializer arrInit);
            if (arrInit != null)
            {
                resultNode = arrInit;
                return(nextLexeme);
            }

            nextLexeme = Literal.TryParse(lexemes, out Literal lit);
            if (lit != null)
            {
                resultNode = lit;
                return(nextLexeme);
            }

            nextLexeme = TryParseNoLit(lexemes, out Expr nolit);
            if (nolit != null)
            {
                resultNode = nolit;
                return(nextLexeme);
            }

            return(lexemes);
        }
Example #2
0
        public static LinkedListNode <Lexeme> TryParse(LinkedListNode <Lexeme> lexemes, out ArrayInitializer resultNode)
        {
            resultNode = null;
            var nextLexeme = Type.TryParse(lexemes, out Type type);

            if (type == null)
            {
                return(lexemes);
            }

            if (nextLexeme.Value.Type != LT.OP_SQBRACKET_O)
            {
                return(lexemes);
            }
            nextLexeme = nextLexeme.Next;

            nextLexeme = Expr.TryParse(nextLexeme, out Expr len);
            if (len == null)
            {
                return(lexemes);
            }

            if (nextLexeme.Value.Type != LT.OP_SQBRACKET_C)
            {
                return(lexemes);
            }
            nextLexeme = nextLexeme.Next;

            Expr def = null;

            if (nextLexeme.Value.Type == LT.OP_BRACE_O)
            {
                var braceLexeme = nextLexeme;
                nextLexeme = nextLexeme.Next;
                nextLexeme = Expr.TryParse(nextLexeme, out def);

                if (def == null)
                {
                    throw new Exception($"Missing default value at {nextLexeme.Value.File}:{nextLexeme.Value.Line}");
                }

                if (nextLexeme.Value.Type != LT.OP_BRACE_C)
                {
                    nextLexeme = braceLexeme;
                    def        = null;
                }
                else
                {
                    nextLexeme = nextLexeme.Next;
                }
            }

            resultNode = new ArrayInitializer {
                DefaultValue = def, Length = len, Type = type, Token = lexemes.Value
            };
            return(nextLexeme);
        }