Yukobaの作ったyacc用のHaskell文法

出典: どう書くwiki

Haskell Hackathon 2008

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 
	;
どう書く?org