const basic = require('./grammar/basic.js')
const id = require('./grammar/id.js')
const type = require('./grammar/type.js')
const exp = require('./grammar/exp.js')
const pat = require('./grammar/pat.js')
const import_ = require('./grammar/import.js')
const module_ = require('./grammar/module.js')
const data = require('./grammar/data.js')
const class_ = require('./grammar/class.js')
const decl = require('./grammar/decl.js')
const pattern = require('./grammar/pattern.js')
const misc = require('./grammar/misc.js')
module.exports = grammar({
name: 'haskell',
extras: $ => [
/\p{Zs}/,
/\n/,
/\r/,
$.cpp,
$.comment,
$.pragma,
],
externals: $ => [
$._layout_semicolon,
$._layout_start,
$._layout_end,
$._dot,
$._arith_dotdot,
$.where,
$._splice_dollar,
$._varsym,
$._consym,
$._tyconsym,
$.comment,
$.cpp,
$.comma,
$.quasiquote_start,
$.quasiquote_bar,
$.quasiquote_body,
$._strict,
$._lazy,
$._unboxed_close,
'|',
'in',
/\n/,
$.empty_file,
],
inline: $ => [
$._number,
$._stringly,
$._qvarid,
$._operator_minus,
$._qvarsym,
$._qvarsym_nominus,
$._var,
$._qvar,
$._tyvar,
$._qconid,
$._qconsym,
$._con,
$._conop,
$._qconop,
$._op,
$._qop_nominus,
$._gcon_literal,
$._gcon,
$._tyconid,
$._qtyconid,
$._qtyconsym,
$._qtycon,
$._gtycon,
$._simple_tycon,
$._simple_tyconop,
$._simple_qtyconop,
$._quantifiers,
$._tyfam_pat_prefix,
$._tyfam_pat_infix,
$._qualifying_module,
],
precedences: _ => [
[
'context-empty',
'con_unit',
],
[
'infix-type',
'btype',
],
[
'function-type',
'type',
],
],
conflicts: $ => [
[$._type_infix, $.type_infix],
[$.type_name, $._simpletype_infix],
[$.type_name, $._simpletype],
[$._atype, $.constraint],
[$._type_infix, $.constraint],
[$._fun_name, $.exp_name],
[$._fun_name, $.pat_name],
[$._fun_name, $.pat_name, $.exp_name],
[$.signature, $.pat_name],
[$.exp_name, $._pat_constructor],
[$.exp_name, $.pat_name],
[$._aexp_projection, $._apat],
[$.exp_type_application, $.pat_type_binder],
[$.type_name, $.data_constructor],
[$.type_name, $.tyfam_pat],
[$._exp_apply, $._fexp],
[$._exp_apply],
[$.pat_apply, $._apat],
[$.pat_apply],
[$.type_apply, $._btype],
[$.type_apply],
[$._type_or_implicit, $._context_constraints],
[$._pat_unboxed_sum, $._exp_unboxed_sum],
[$.exp_unboxed_tuple, $.pat_unboxed_tuple],
[$.exp_lambda_case],
[$.annotated_type_variable, $.type_name],
[$.exp_if_guard],
],
word: $ => $._varid,
rules: {
haskell: $ => choice(
$.empty_file,
$._module,
terminated($, $._topdecl),
),
_topdecl: $ => choice(
alias($.decl_type, $.type_alias),
alias($.decl_tyfam, $.type_family),
alias($.decl_tyinst, $.type_instance),
alias($.decl_role, $.role_annotation),
alias($.decl_adt, $.adt),
alias($.decl_newtype, $.newtype),
alias($.decl_datafam, $.data_family),
alias($.decl_datainst, $.data_instance),
alias($.decl_import, $.import),
alias($.decl_class, $.class),
alias($.decl_instance, $.instance),
alias($.decl_default, $.default_declaration),
$._decl_foreign,
alias($.decl_deriving, $.deriving_declaration),
$._decl,
alias($.decl_pattern, $.pattern_synonym),
$.top_splice,
$.decl_special,
),
...basic,
...id,
...type,
...exp,
...pat,
...import_,
...module_,
...data,
...class_,
...decl,
...pattern,
...misc,
}
})