public BlockExpression function_expression()
        {
            BlockExpression m = null;
            IToken token = null;
            try
            {
                Block block;
                token = this.LT(1);
                this.match(0x13);
                if (base.inputState.guessing == 0)
                {
                    m = new BlockExpression(ToLexicalInfo(token));
                    m.Annotate("inline");
                    block = m.get_Body();
                }
                this.match(0x3f);
                switch (this.LA(1))
                {
                    case 12:
                    case 0x10:
                    case 0x21:
                    case 0x3b:
                    case 0x63:
                        this.parameter_declaration_list(m);
                        break;

                    case 0x40:
                        break;

                    default:
                        throw new NoViableAltException(this.LT(1), this.getFilename());
                }
                this.match(0x40);
                switch (this.LA(1))
                {
                    case 0x42:
                    {
                        this.match(0x42);
                        TypeReference reference = this.type_reference();
                        if (base.inputState.guessing == 0)
                        {
                            m.set_ReturnType(reference);
                        }
                        break;
                    }
                    case 12:
                    case 15:
                    case 0x13:
                    case 0x1b:
                    case 0x1d:
                    case 0x27:
                    case 40:
                    case 0x2a:
                    case 0x2c:
                    case 0x3b:
                    case 60:
                    case 0x3d:
                    case 0x3f:
                    case 0x44:
                    case 0x4f:
                    case 80:
                    case 0x52:
                    case 0x58:
                    case 0x67:
                    case 0x69:
                    case 0x6a:
                    case 0x6b:
                    case 0x6c:
                    case 0x6d:
                        break;

                    default:
                        throw new NoViableAltException(this.LT(1), this.getFilename());
                }
                if ((this.LA(1) == 0x3d) && tokenSet_13_.member(this.LA(2)))
                {
                    this.block(block);
                    return m;
                }
                if (!tokenSet_16_.member(this.LA(1)) || !tokenSet_20_.member(this.LA(2)))
                {
                    throw new NoViableAltException(this.LT(1), this.getFilename());
                }
                Expression expression2 = this.expression();
                if (base.inputState.guessing == 0)
                {
                    block.Add(expression2);
                }
                return m;
            }
            catch (RecognitionException exception)
            {
                if (base.inputState.guessing != 0)
                {
                    throw;
                }
                this.reportError(exception);
                this.recover(exception, tokenSet_20_);
                return m;
            }
            return m;
        }