Exemplo n.º 1
0
        private ParseFunctionResult StatementList(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.STATEMENT_LIST);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!CheckNotEndOfTokens(ts, node, out result))
            {
                return(result);
            }

            if (ts.Current.Value != "}")
            {
                if (!Resolve(ts, node, Statement, out result))
                {
                    return(result);
                }

                if (!ExpectValue(ts, node, ";", out result))
                {
                    return(result);
                }

                if (!Resolve(ts, node, StatementList, out result))
                {
                    return(result);
                }
            }

            return(result);
        }
Exemplo n.º 2
0
        private ParseFunctionResult ExpressionDash(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.EXPRESSION_DASH);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (ts.Current != null)
            {
                switch (ts.Current.Value)
                {
                case "+":
                    node.AddChild(new SyntaxTreeNode(new ConcreteTerminal(ts.Pop())));

                    if (!Resolve(ts, node, Term, out result))
                    {
                        return(result);
                    }

                    if (!Resolve(ts, node, ExpressionDash, out result))
                    {
                        return(result);
                    }
                    break;

                case "-": goto case "+";

                default: break;
                }
            }

            return(result);
        }
Exemplo n.º 3
0
        private ParseFunctionResult AssignStatement(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.ASSIGN_STATEMENT);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!Try(ts, Type).HasError)
            {
                Resolve(ts, node, Type, out result);
            }

            if (!ExpectTokenType(ts, node, TokenType.Identifier, out result))
            {
                return(result);
            }

            if (!ExpectValue(ts, node, "=", out result))
            {
                return(result);
            }

            if (!Resolve(ts, node, Expression, out result))
            {
                return(result);
            }

            return(result);
        }
Exemplo n.º 4
0
        private ParseFunctionResult Statement(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.STATEMENT);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!CheckNotEndOfTokens(ts, node, out result))
            {
                return(result);
            }

            if (ts.Current.HasType(TokenType.Function))
            {
                Resolve(ts, node, FunctionCall, out result);
            }
            else if (ts.Current.HasType(TokenType.Identifier) || !Try(ts, Type).HasError)
            {
                Resolve(ts, node, AssignStatement, out result);
            }
            else if (ts.Current.Value == "if")
            {
                Resolve(ts, node, IfStatement, out result);
            }
            else
            {
                return(new ParseFunctionResult(node, ts.Current, "Statement expected"));
            }

            return(result);
        }
Exemplo n.º 5
0
        private ParseFunctionResult ParamListDash(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.PARAM_LIST_DASH);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!CheckNotEndOfTokens(ts, node, out result))
            {
                return(result);
            }

            if (ts.Current.Value == ",")
            {
                node.AddChild(new SyntaxTreeNode(new ConcreteTerminal(ts.Pop())));

                if (!Resolve(ts, node, Param, out result))
                {
                    return(result);
                }

                if (!Resolve(ts, node, ParamListDash, out result))
                {
                    return(result);
                }
            }

            return(result);
        }
Exemplo n.º 6
0
        private ParseFunctionResult ParamList(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.PARAM_LIST);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!CheckNotEndOfTokens(ts, node, out result))
            {
                return(result);
            }

            if (ts.Current.Value != ")")
            {
                var param = Param(ts);
                if (param.HasError)
                {
                    return(new ParseFunctionResult(node, param.Error));
                }
                if (!param.Node.HasNoChildren)
                {
                    node.AddChild(param.Node);

                    Resolve(ts, node, ParamListDash, out result);
                }
            }

            return(result);
        }
Exemplo n.º 7
0
        private ParseFunctionResult ElseBlock(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.ELSE_BLOCK);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (ts.Current != null && ts.Current.Value == "else")
            {
                if (!ExpectValue(ts, node, "else", out result))
                {
                    return(result);
                }

                if (!ExpectValue(ts, node, "{", out result))
                {
                    return(result);
                }

                if (!Resolve(ts, node, StatementList, out result))
                {
                    return(result);
                }

                if (!ExpectValue(ts, node, "}", out result))
                {
                    return(result);
                }
            }

            return(result);
        }
Exemplo n.º 8
0
        private ParseFunctionResult Type(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.TYPE);
            ParseFunctionResult result = new ParseFunctionResult(node);

            ExpectValues(ts, node, new[] { "int", "float", "void", "string", "char" }, out result);

            return(result);
        }
Exemplo n.º 9
0
        private bool CheckNotEndOfTokens(TokenStream ts, SyntaxTreeNode node, out ParseFunctionResult result)
        {
            if (ts.Current == null)
            {
                result = new ParseFunctionResult(node, ts.Last, "Unexpected end");
                return(false);
            }

            result = new ParseFunctionResult(node);

            return(true);
        }
Exemplo n.º 10
0
        private ParseFunctionResult Expression(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.EXPRESSION);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!Resolve(ts, node, Term, out result))
            {
                return(result);
            }

            Resolve(ts, node, ExpressionDash, out result);

            return(result);
        }
Exemplo n.º 11
0
        private ParseFunctionResult Function(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.FUNCTION);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!Resolve(ts, node, Type, out result))
            {
                return(result);
            }

            if (!ExpectTokenType(ts, node, TokenType.Identifier, out result))
            {
                return(result);
            }

            if (!ExpectValue(ts, node, "(", out result))
            {
                return(result);
            }

            //node.AddChild(ParamList(ts));

            if (!ExpectValue(ts, node, ")", out result))
            {
                return(result);
            }

            if (!ExpectValue(ts, node, "{", out result))
            {
                return(result);
            }

            if (!Resolve(ts, node, StatementList, out result))
            {
                return(result);
            }

            if (!ExpectValue(ts, node, "}", out result))
            {
                return(result);
            }

            if (!ExpectTokenType(ts, node, TokenType.EndOfText, out result))
            {
                return(result);
            }

            return(result);
        }
Exemplo n.º 12
0
        private ParseFunctionResult Param(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.PARAM);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!CheckNotEndOfTokens(ts, node, out result))
            {
                return(result);
            }

            if (ts.Current.Value != ")")
            {
                Resolve(ts, node, Expression, out result);
            }

            return(result);
        }
Exemplo n.º 13
0
        private ParseFunctionResult Term(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.TERM);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!Resolve(ts, node, Factor, out result))
            {
                return(result);
            }

            if (!Resolve(ts, node, TermDash, out result))
            {
                return(result);
            }

            return(result);
        }
Exemplo n.º 14
0
        private bool Resolve(TokenStream ts, SyntaxTreeNode node, Func <TokenStream, ParseFunctionResult> resolutionFunction, out ParseFunctionResult result)
        {
            var resolved = resolutionFunction(ts);

            if (resolved.HasError)
            {
                result = new ParseFunctionResult(node, resolved.Error);
                return(false);
            }

            resolved.Node.Parent = node;

            node.AddChild(resolved.Node);

            result = new ParseFunctionResult(node);

            return(true);
        }
Exemplo n.º 15
0
        private bool ExpectValues(TokenStream ts, SyntaxTreeNode node, IEnumerable <string> values, out ParseFunctionResult result)
        {
            if (!CheckNotEndOfTokens(ts, node, out result))
            {
                return(false);
            }

            if (values.All(val => val != ts.Current.Value))
            {
                result = new ParseFunctionResult(node, ts.Current, string.Format("{0} expected", string.Join(" or ", values)));
                return(false);
            }

            result = new ParseFunctionResult(node);

            node.AddChild(new SyntaxTreeNode(new ConcreteTerminal(ts.Pop())));

            return(true);
        }
Exemplo n.º 16
0
        private bool ExpectTokenType(TokenStream ts, SyntaxTreeNode node, TokenType tokenType, out ParseFunctionResult result)
        {
            if (!CheckNotEndOfTokens(ts, node, out result))
            {
                return(false);
            }

            if (!ts.Current.HasType(tokenType))
            {
                result = new ParseFunctionResult(node, ts.Current, string.Format("{0} expected", tokenType));
                return(false);
            }

            result = new ParseFunctionResult(node);

            node.AddChild(new SyntaxTreeNode(new ConcreteTerminal(ts.Pop())));

            return(true);
        }
Exemplo n.º 17
0
        private ParseFunctionResult IfStatement(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.IF_STATEMENT);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!Resolve(ts, node, IfBlock, out result))
            {
                return(result);
            }

            if (!Resolve(ts, node, ThenBlock, out result))
            {
                return(result);
            }

            Resolve(ts, node, ElseBlock, out result);

            return(result);
        }
Exemplo n.º 18
0
        private ParseFunctionResult BoolExpression(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.BOOL_EXPRESSION);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!Resolve(ts, node, Expression, out result))
            {
                return(result);
            }

            if (!ExpectValues(ts, node, new[] { "==", "!=", ">", "<", ">=", "<=" }, out result))
            {
                return(result);
            }

            if (!Resolve(ts, node, Expression, out result))
            {
                return(result);
            }

            return(result);
        }
Exemplo n.º 19
0
        private ParseFunctionResult ThenBlock(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.THEN_BLOCK);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!ExpectValue(ts, node, "{", out result))
            {
                return(result);
            }

            if (!Resolve(ts, node, StatementList, out result))
            {
                return(result);
            }

            if (!ExpectValue(ts, node, "}", out result))
            {
                return(result);
            }

            return(result);
        }
Exemplo n.º 20
0
        private ParseFunctionResult Factor(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.FACTOR);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!CheckNotEndOfTokens(ts, node, out result))
            {
                return(result);
            }

            if (ts.Current.Value == "(")
            {
                node.AddChild(new SyntaxTreeNode(new ConcreteTerminal(ts.Pop())));

                if (!Resolve(ts, node, Expression, out result))
                {
                    return(result);
                }

                ExpectValue(ts, node, ")", out result);
            }
            else if (ts.Current.HasOneOfTypes(TokenType.IntegerConstant, TokenType.FloatConstant, TokenType.Identifier))
            {
                node.AddChild(new SyntaxTreeNode(new ConcreteTerminal(ts.Pop())));
            }
            else if (ts.Current.HasType(TokenType.Function))
            {
                Resolve(ts, node, FunctionCall, out result);
            }
            else
            {
                return(new ParseFunctionResult(node, ts.Current, "Factor expected"));
            }

            return(result);
        }
Exemplo n.º 21
0
        private ParseFunctionResult FunctionCall(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.FUNCTION_CALL);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!ExpectTokenType(ts, node, TokenType.Function, out result))
            {
                return(result);
            }

            if (!ExpectValue(ts, node, "(", out result))
            {
                return(result);
            }

            if (!Resolve(ts, node, ParamList, out result))
            {
                return(result);
            }

            ExpectValue(ts, node, ")", out result);

            return(result);
        }
Exemplo n.º 22
0
        private ParseFunctionResult IfBlock(TokenStream ts)
        {
            var node = new SyntaxTreeNode(MyNonterminals.IF_BLOCK);
            ParseFunctionResult result = new ParseFunctionResult(node);

            if (!ExpectValue(ts, node, "if", out result))
            {
                return(result);
            }

            if (!ExpectValue(ts, node, "(", out result))
            {
                return(result);
            }

            if (!Resolve(ts, node, BoolExpression, out result))
            {
                return(result);
            }

            ExpectValue(ts, node, ")", out result);

            return(result);
        }