private ExpressionNode FExpression() throws SyntaxException {
        try {
            ExpressionNode node = JExpression();

            while (iterator.current().type().is(
                new Token.Type[] {
                    Token.Type.MEMBER_SELECT, 
                    Token.Type.LEFT_BRACKET,
                    Token.Type.LEFT_SQUARE_BRACKET
                })
            ) {
                if (iterator.current().type().is(Token.Type.MEMBER_SELECT)) {
                    Position pos = iterator.current().coordinates().starting();
                    nextToken();
                    Position varPos = iterator.current().coordinates().starting();
                    String fieldName = Identifier();

                    node = new BinaryOperationNode(
                            BinaryOperationNode.Operation.MEMBER_SELECT,
                            node,
                            new VariableLeaf(fieldName, varPos), pos);
                } else if (iterator.current().type().is(Token.Type.LEFT_BRACKET)) {
                    Position pos = iterator.current().coordinates().starting();
                    LeftBracket();

                    BlockNode<ExpressionNode> args = new BlockNode<ExpressionNode>();
                    if (iterator.current().type().is(Token.Type.FirstOfExpression)) {           
                        args.addChild(Expression());
                        while (iterator.current().type() == Token.Type.COMMA) {
                            nextToken();
                            args.addChild(Expression());
                        }
                    }
                    RightBracket();

                    node = new CallNode(node, args, pos);
                } else {
                    LeftSquareBracket();
                    Position pos = iterator.current().coordinates().starting();
                    node = new BinaryOperationNode(
                            BinaryOperationNode.Operation.ARRAY_ELEMENT, 
                            node, Expression(), pos);
                    RightSquareBracket();
                }
            }

            return node;
        } catch(SyntaxException ex) {
            throw ex;
        } catch(Exception ex) {
            throw (NonAnalysisException)new NonAnalysisException(ex)
                    .initPosition(iterator.current().coordinates().starting())
                    .Log("ru.bmstu.iu9.compiler.syntax");
        }
    }