Yukobaの作ったyacc用のHaskell文法
出典: どう書くwiki
EBNFの記号が残っています。 ()や{}や[]はHaskellの記号だったり、EBNFの記号だったり激しくややこしいです。 予約語もシングルクォーテーションでくくっています。 この部分は書き換え必要です。 yaccではそのままは動きません。
module : 'module' modid [exports] 'where' body
| body
;
body : '{' impdecls ';' topdecls '}'
| '{' impdecls '}'
| '{' topdecls '}'
;
impdecls : impdecl1 ';' ... ';' impdecln
;
exports : '(' export1 ',' ... ',' exportn [ ',' ] ')'
;
export : qvar
| qtycon ['(' '..' ')' | '(' cname1 ',' ... ',' cnamen ')']
| qtycls ['(' '..' ')' | '(' qvar1 ',' ... ',' qvarn ')']
| 'module' modid
;
impdecl : 'import' [qualified] modid ['as' modid] [impspec]
|
;
impspec : '(' import1 ',' ... ',' importn [ ',' ] ')'
| 'hiding' '(' import1 ',' ... ',' importn [ ',' ] ')'
;
import : var
| tycon [ '(' '..' ')' | '(' cname1 ',' ... ',' cnamen ')']
| tycls ['(' '..' ')' | '(' var1 ',' ... ',' varn ')']
;
cname : var | con
;
topdecls : topdecl1 ';' ... ';' topdecln
;
topdecl : 'type' simpletype '=' type
| 'data' [context '=>'] simpletype '=' constrs [deriving]
| 'newtype' [context '=>'] simpletype '=' newconstr [deriving]
| 'class' [scontext '=>'] tycls tyvar ['where' cdecls]
| 'instance' [scontext '=>'] qtycls inst ['where' idecls]
| 'default' '(' type1 ',' ... ',' typen ')'
| decl
;
decls : '{' decl1 ';' ... ';' decln '}'
;
decl : gendecl
| (funlhs | pat0) rhs
;
cdecls : '{' cdecl1 ';' ... ';' cdecln '}'
;
cdecl : gendecl
| (funlhs | var) rhs
;
idecls : '{' idecl1 ';' ... ';' idecln '}'
;
idecl : (funlhs | var) rhs
|
;
gendecl : vars '::' [context '=>'] type
| fixity [integer] ops
|
;
ops : op1 ',' ... ',' opn
;
vars : var1 ',' ... ',' varn
;
fixity : 'infixl' | 'infixr' | 'infix'
;
type : btype ['->' type]
;
btype : [btype] atype
;
atype : gtycon
| tyvar
| '(' type1 ',' ... ',' typek ')'
| '[' type ']'
| '(' type ')'
;
gtycon : qtycon
| '(' ')'
| '[' ']'
| '(' '->' ')'
| '(' ',' {','} ')'
;
context : class
| '(' class1 ',' ... ',' classn ')'
;
class : qtycls tyvar
| qtycls '(' tyvar atype1 ... atypen ')'
;
scontext : simpleclass
| '(' simpleclass1 ',' ... ',' simpleclassn ')'
;
simpleclass : qtycls tyvar
;
simpletype : tycon tyvar1 ... tyvark
;
constrs : constr1 | ... | constrn
;
constr : con ['!'] atype1 ... ['!'] atypek
| (btype | '!' atype) conop (btype | '!' atype)
| con '{' fielddecl1 ',' ... ',' fielddecln '}'
;
newconstr : con atype
| con '{' var '::' type '}'
;
fielddecl : vars '::'
;
deriving : deriving (dclass | '(' dclass1 ',' ... ',' dclassn ')' )
;
dclass : qtycls
;
inst : gtycon
| '(' gtycon tyvar1 ... tyvark ')'
| '(' tyvar1 ',' ... ',' tyvark ')'
| '[' tyvar ']'
| '(' tyvar1 '->' tyvar2 ')' tyvar1 'and' tyvar2 'distinct'
;
funlhs : var apat {apat }
| pati+1 varop(a,i) pati+1
| lpati varop(l,i) pati+1
| pati+1 varop(r,i) rpati
| '(' funlhs ')' apat {apat }
;
rhs : '=' exp ['where' decls]
| gdrhs ['where' decls]
;
gdrhs : gd '=' exp [gdrhs]
;
gd : | exp0
;
exp : exp0 '::' [context '=>'] type
| exp0
;
expi : expi+1 [qop(n,i) expi+1]
| lexpi
| rexpi
;
lexpi : (lexpi | expi+1) qop(l,i) expi+1
;
lexp6 : '-' exp7
;
rexpi : expi+1 qop(r,i)
;
exp10 : BACK_SLASH apat1 ... apatn '->' exp
| 'let' decls 'in' exp
| 'if' exp 'then' exp 'else' exp
| 'case' exp 'of' '{' alts '}'
| 'do' '{' stmts '}'
| fexp
;
fexp : [fexp] aexp
;
aexp : qvar
| gcon
| literal
| '(' exp ')'
| '(' exp1 ',' ... ',' expk ')'
| '[' exp1 ',' ... ',' expk ']'
| '[' exp1 [',' exp2] '..' [exp3] ']'
| '[' exp | qual1 ',' ... ',' qualn ']'
| '(' expi+1 qop(a,i) ')'
| '(' lexpi qop(l,i) ')'
| '(' qop(a,i) '<->' expi+1 ')'
| '(' qop(r,i) '<->' rexpi ')'
| qcon '{' fbind1 ',' ... ',' fbindn '}'
| aexp<qcon> '{' fbind1 ',' ... ',' fbindn '}'
;
qual : pat '<-' exp
| 'let' decls
| exp
;
alts : alt1 ';' ... ';' altn
;
alt : pat ':' exp ['where' decls]
| pat gdpat ['where' decls]
|
;
gdpat : gd '->' exp [ gdpat ]
;
stmts : stmt1 ... stmtn exp [';']
;
stmt : exp ';'
| pat '<-' exp ';'
| 'let' decls ';'
| ';'
;
fbind : qvar '=' exp
;
pat : var '+' integer
| pat0
;
pati : pati+1 [qconop(n,i) pati+1]
| lpati
| rpati
;
lpati : (lpati | pati+1) qconop(l,i) pati+1
;
lpat6 : '-' (integer | float)
;
rpati : pati+1 qconop(r,i)
;
pat10 : apat
| gcon apat1 ... apatk
;
apat : var ['@' apat]
| gcon
| qcon '{' fpat1 ',' ... ',' fpatk '}'
| literal
| '_'
| '(' pat ')'
| '(' pat1 ',' ... ',' patk ')'
| '[' pat1 ',' ... ',' patk ']'
| '~' apat
;
fpat : qvar '=' pat
;
gcon : '(' ')'
| '[' ']'
| '(' ',' {','} ')'
| qcon
;
var : varid | '(' varsym ')'
;
qvar : qvarid | '(' qvarsym ')'
;
con : conid | '(' consym ')'
;
qcon : qconid | '(' gconsym ')'
;
varop : varsym | '`' varid '`'
;
qvarop : qvarsym | '`' qvarid '`'
;
conop : consym | '`' conid '`'
;
qconop : gconsym | '`' qconid '`'
;
op : varop | conop
;
qop : qvarop | qconop
;
gconsym : ':' | qconsym
;

