Example #1
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);
        }
Example #2
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);
        }
Example #3
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);
        }
Example #4
0
        private void ConstructSyntaxTree(Production usedProduction)
        {
            Nonterminal    nonterminal = usedProduction.LeftPart;
            SyntaxTreeNode node        = _syntaxTree.FindFirst(n => n.HasNoChildren && n.Value.Equals(nonterminal));

            foreach (var symbol in usedProduction.RightPart)
            {
                node.AddChild(new SyntaxTreeNode(symbol.CreateCopy()));
            }
        }
Example #5
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);
        }
Example #6
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);
        }
Example #7
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);
        }
Example #8
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);
        }