forked from GitHub/gf-core
simple source language for compiler experiment
This commit is contained in:
64
devel/compiler/Src.cf
Normal file
64
devel/compiler/Src.cf
Normal file
@@ -0,0 +1,64 @@
|
||||
Gr. Grammar ::= [Def] ;
|
||||
|
||||
DPar. Def ::= "param" Ident "=" [Constr] ;
|
||||
DOper. Def ::= "oper" Ident ":" Type "=" Exp ;
|
||||
DOpty. Def ::= "oper" Ident "=" Type ;
|
||||
DLin. Def ::= "lin" Ident ":" Type "=" Exp ;
|
||||
|
||||
terminator Def ";" ;
|
||||
|
||||
Con. Constr ::= Ident [Type] ;
|
||||
|
||||
separator nonempty Constr "|" ;
|
||||
|
||||
TBas. Type1 ::= Ident ;
|
||||
TVal. Type1 ::= "Ints" Integer ;
|
||||
TRec. Type1 ::= "{" [Typing] "}" ;
|
||||
TFun. Type ::= Type1 "->" Type ;
|
||||
|
||||
coercions Type 1 ;
|
||||
|
||||
terminator Type "" ;
|
||||
|
||||
FTyp. Typing ::= Ident ":" Type ;
|
||||
|
||||
separator Typing ";" ;
|
||||
|
||||
EVar. Exp2 ::= "$" Ident ;
|
||||
ECon. Exp2 ::= Ident ;
|
||||
EVal. Exp2 ::= Integer ;
|
||||
EStr. Exp2 ::= String ;
|
||||
ERec. Exp2 ::= "{" [Assign] "}" ;
|
||||
EApp. Exp1 ::= Exp1 Exp2 ;
|
||||
ESel. Exp1 ::= Exp1 "!" Exp2 ;
|
||||
EPro. Exp1 ::= Exp1 "." Exp2 ;
|
||||
ETab. Exp1 ::= "table" "{" [Case] "}" ;
|
||||
ETbv. Exp1 ::= "table" "(" Type ")" "{" [Exp] "}" ;
|
||||
ECat. Exp ::= Exp "++" Exp1 ;
|
||||
EAbs. Exp ::= "\\" Ident "->" Exp ;
|
||||
|
||||
coercions Exp 2 ;
|
||||
|
||||
separator Exp ";" ;
|
||||
|
||||
FExp. Assign ::= Ident "=" Exp ;
|
||||
|
||||
separator Assign ";" ;
|
||||
|
||||
Cas. Case ::= Patt "=>" Exp ;
|
||||
|
||||
separator Case ";" ;
|
||||
|
||||
PVal. Patt ::= Integer ;
|
||||
PVar. Patt ::= "$" Ident ;
|
||||
PRec. Patt ::= "{" [AssPatt] "}" ;
|
||||
PCon. Patt ::= "(" Ident [Patt] ")" ;
|
||||
|
||||
terminator Patt "" ;
|
||||
|
||||
FPatt. AssPatt ::= Ident "=" Patt ;
|
||||
|
||||
separator AssPatt ";" ;
|
||||
|
||||
comment "--" ;
|
||||
comment "{-" "-}" ;
|
||||
31
devel/compiler/ex.src
Normal file
31
devel/compiler/ex.src
Normal file
@@ -0,0 +1,31 @@
|
||||
param Num = Sg | Pl ;
|
||||
param Gen = Masc | Fem ;
|
||||
|
||||
oper Agr = {g : Gen ; n : Num} ;
|
||||
|
||||
oper CN = {s : Num -> Str ; g : Gen} ;
|
||||
oper NP = {s : Str ; a : Agr} ;
|
||||
|
||||
oper artDef : Gen -> Str = \g -> table {
|
||||
(Masc) => "le" ;
|
||||
(Fem) => "la"
|
||||
} ! g ;
|
||||
|
||||
|
||||
lin Voiture : CN = {
|
||||
s = table {
|
||||
(Sg) => "voiture" ;
|
||||
(Pl) => "voitures"
|
||||
} ;
|
||||
g = Fem
|
||||
} ;
|
||||
|
||||
lin Bus : CN = {
|
||||
s = table {$x => "bus"} ;
|
||||
g = Masc
|
||||
} ;
|
||||
|
||||
lin Def : CN -> NP = \cn -> {
|
||||
s = artDef cn.g ++ cn.s ! Sg ;
|
||||
a = {g = cn.g ; n = Sg}
|
||||
} ;
|
||||
Reference in New Issue
Block a user