Example #1
0
        /// <summary>
        /// block2 = block3, { sign3, block3 } ;
        /// </summary>
        /// <returns></returns>
        public SyntaxTreeNode ParseBlock2()
        {
            // ? [ "-" | "!" ]
              Lexem invertLexem = null;
              if(PeekLexem(LexemType.Subtract, LexemType.Not))
              {
            invertLexem = GetLexem();
            SkipLexem();
              }

              // block3
              var node = ParseBlock3();

              if(invertLexem != null)
              {
            if (invertLexem.Type == LexemType.Subtract)
              node = new OperatorInvertNode(node);
            else
              node = new OperatorNegateNode(node);

            node.Lexem = invertLexem;
              }

              // { sign3, block3 }
              while (PeekLexem(LexemTypeGroup.Sign3))
              {
            var lexem = GetLexem(0, true);
            if (lexem.Type == LexemType.NewLine) return node;

            SkipLexem();
            BinaryOperatorNode newNode;
            switch (lexem.Type)
            {
              case LexemType.Add: newNode = new OperatorAddNode(); break;
              case LexemType.Subtract: newNode = new OperatorSubtractNode(); break;
              default: throw new NotImplementedException();
            }

            // block3
            newNode.Left = node;
            newNode.Right = ParseBlock3();
            newNode.Lexem = lexem;

            node = newNode;
              }

              return node;
        }
Example #2
0
        /// <summary>
        /// array_expr = [ "-" ], ( literal | identifier | "(" expr ")" ) ;
        /// </summary>
        /// <returns></returns>
        public SyntaxTreeNode ParseArrayExpr()
        {
            SyntaxTreeNode node = null;

              // ? "-"
              var invert = false;
              if (PeekLexem(LexemType.Subtract))
              {
            invert = true;
            SkipLexem();
              }

              if (PeekLexem(LexemTypeGroup.Literal))
            node = ParseLiteral();
              else if (PeekLexem(LexemType.Identifier))
              {
            var lexem = GetLexem();
            var idNode = new IdentifierGetNode(lexem.Data);

            if (lexem.Data[0] == '@')
            {
              idNode.Name = idNode.Name.Substring(1, idNode.Name.Length - 1);
              idNode.AtmarkPrefix = true;
            }

            node = idNode;
            node.Lexem = lexem;
            SkipLexem();
              }
              else if (PeekLexem(LexemType.ParenOpen))
              {
            // "("
            SkipLexem();

            node = ParseExpr();

            // ")"
            if (!PeekLexem(LexemType.ParenClose)) Error(Resources.errParenExpected);
            SkipLexem(true);
              }
              else
            Error(Resources.errArrayExpressionParensExpected);

              // invert if needed
              if (invert)
            node = new OperatorInvertNode(node);

              return node;
        }