module OracleSqlParser::Grammar

grammar Expression
  include OracleSqlParser::Grammar::Expression::Compound
  include OracleSqlParser::Grammar::Expression::Function
  include OracleSqlParser::Grammar::Expression::Case
  include OracleSqlParser::Grammar::Expression::Simple
  include OracleSqlParser::Grammar::Expression::Cursor
  include OracleSqlParser::Grammar::Expression::Datetime
  include OracleSqlParser::Grammar::Expression::Interval

  rule sql_expression
    ex:(
      interval_expression /
      compound_expression /
      function_expression /
      case_expression /
      cursor_expression /
      datetime_expression /
      object_access_expression /
      scalar_subquery_expression /
      model_expression /
      type_constructor_expression /
      simple_expression /
      variable_expression /
      column_expression /
      json_object_access_expression /
      object_access_expression
      ) {
      def ast
        ex.ast
      end
    }
  end

  rule not_loop_sql_expression
    ex:(
      function_expression /
      case_expression /
      cursor_expression /
      object_access_expression /
      scalar_subquery_expression /
      model_expression /
      type_constructor_expression /
      simple_expression /
      variable_expression)
    {
      def ast
        ex.ast
      end
    }
  end

  rule object_access_expression
    'object_access_expression' # not implemented
  end

  rule scalar_subquery_expression
    'scalar_subquery_expression' # not implemented
  end

  rule model_expression
    'model_expression' # not implemented
  end

  rule type_constructor_expression
    'type_constructor_expression' # not implemented
  end

  rule variable_expression
    'variable_expression' # not implemented
  end

  rule column_expression
    'column_expression' # not implemented
  end

  rule json_object_access_expression
    'json_object_access_expression' # not implemented
  end

  rule expression_list  # from grouping_expression_list
    (
      '(' e:exprs ')' /
      e:exprs
    ) {
      def ast
        e.ast
      end
    }
  end

  rule exprs
    expr more:(space? ',' space? more_expr:expr)* {
      def ast
        OracleSqlParser::Ast::Array[expr.ast, *more_exprs.map(&:ast)]
      end

      def more_exprs
        more.elements.map{|e| e.more_expr}
      end
    }
  end

  rule expr
    sql_expression {
      def ast
        super
      end
    }
  end

end

end