/// <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; }
/// <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; }