Пример #1
0
        public static bool TryParseNode(IParser parser, out PrintxStatement node)
        {
            node = null;
            bool result = false;

            if (parser.PeekToken(TokenKind.PrintxKeyword))
            {
                result = true;
                node   = new PrintxStatement();
                parser.NextToken();
                node.StartIndex  = parser.Token.Span.Start;
                node.Expressions = new List <ExpressionNode>();

                if (parser.PeekToken(TokenKind.NameKeyword))
                {
                    parser.NextToken();
                    if (parser.PeekToken(TokenKind.Equals))
                    {
                        parser.NextToken();
                        FglNameExpression name;
                        if (FglNameExpression.TryParseNode(parser, out name))
                        {
                            node.Name = name;
                        }
                        else
                        {
                            parser.ReportSyntaxError("Invalid name expression found in printx statement.");
                        }
                    }
                    else
                    {
                        parser.ReportSyntaxError("Expected '=' in printx statement.");
                    }
                }

                ExpressionNode expr;
                while (FglExpressionNode.TryGetExpressionNode(parser, out expr))
                {
                    node.Expressions.Add(expr);
                    if (parser.PeekToken(TokenKind.Comma))
                    {
                        parser.NextToken();
                    }
                    else
                    {
                        break;
                    }
                }

                node.EndIndex = parser.Token.Span.End;
            }

            return(result);
        }
Пример #2
0
        private static bool TryGetReportStatement(IParser parser, out FglStatement node, ReportBlockNode reportNode, bool returnFalseInsteadOfErrors = false)
        {
            bool result = false;

            node = null;

            switch (parser.PeekToken().Kind)
            {
            case TokenKind.PrintKeyword:
            {
                PrintStatement prtStmt;
                if ((result = PrintStatement.TryParseNode(parser, out prtStmt, reportNode)))
                {
                    node = prtStmt;
                }
                break;
            }

            case TokenKind.PrintxKeyword:
            {
                PrintxStatement prtxStmt;
                if ((result = PrintxStatement.TryParseNode(parser, out prtxStmt)))
                {
                    node = prtxStmt;
                }
                break;
            }

            case TokenKind.NeedKeyword:
            {
                NeedStatement needStmt;
                if ((result = NeedStatement.TryParseNode(parser, out needStmt)))
                {
                    node = needStmt;
                }
                break;
            }

            case TokenKind.PauseKeyword:
            {
                PauseStatement pauseStmt;
                if ((result = PauseStatement.TryParseNode(parser, out pauseStmt)))
                {
                    node = pauseStmt;
                }
                break;
            }

            case TokenKind.SkipKeyword:
            {
                SkipStatement skipStmt;
                if ((result = SkipStatement.TryParseNode(parser, out skipStmt)))
                {
                    node = skipStmt;
                }
                break;
            }

            default:
                result = false;
                break;
            }

            return(result);
        }