diff --git a/devel/compiler/Eval.hs b/devel/compiler/Eval.hs index b59fb53f2..f0c4f1303 100644 --- a/devel/compiler/Eval.hs +++ b/devel/compiler/Eval.hs @@ -52,8 +52,6 @@ eval e = case e of ---- pattern match first return $ compVal [] $ VPro t' v' ---- [] - EPro t v -> do + EPro t v@(Lab _ i) -> do t' <- eval t - ---- project first - return $ VPro t' (VPar 666) ---- lookup label - + return $ compVal [] $ VPro t' (VPar i) diff --git a/devel/compiler/Src.cf b/devel/compiler/Src.cf index d3b29ee45..5a49b2341 100644 --- a/devel/compiler/Src.cf +++ b/devel/compiler/Src.cf @@ -20,10 +20,12 @@ coercions Type 1 ; terminator Type "" ; -FTyp. Typing ::= Ident ":" Type ; +FTyp. Typing ::= Label ":" Type ; separator Typing ";" ; +Lab. Label ::= Ident "#" Integer ; + EVar. Exp2 ::= "$" Ident ; EOpr. Exp2 ::= "&" Ident ; ECon. Exp2 ::= Ident ; @@ -33,7 +35,7 @@ ECst. Exp2 ::= "(" Ident "@" [Exp] ")" ; ERec. Exp2 ::= "{" [Assign] "}" ; EApp. Exp1 ::= Exp1 Exp2 ; ESel. Exp1 ::= Exp1 "!" Exp2 ; -EPro. Exp1 ::= Exp1 "." Exp2 ; +EPro. Exp1 ::= Exp1 "." Label ; ETab. Exp1 ::= "table" Type "{" [Case] "}" ; ECat. Exp ::= Exp "++" Exp1 ; EAbs. Exp ::= "\\" Ident "->" Exp ; @@ -42,7 +44,7 @@ coercions Exp 2 ; separator Exp "," ; -FExp. Assign ::= Ident "=" Exp ; +FExp. Assign ::= Label "=" Exp ; separator Assign ";" ; @@ -57,7 +59,7 @@ PCon. Patt ::= "(" Ident [Patt] ")" ; terminator Patt "" ; -FPatt. AssPatt ::= Ident "=" Patt ; +FPatt. AssPatt ::= Label "=" Patt ; separator AssPatt ";" ; diff --git a/devel/compiler/ex.src b/devel/compiler/ex.src index 6169cb5ee..241fd96b4 100644 --- a/devel/compiler/ex.src +++ b/devel/compiler/ex.src @@ -3,10 +3,10 @@ param Gen = Masc | Fem ; param AG = A Num Gen ; -oper Agr = {g : Gen ; n : Num} ; +oper Agr = {g#0 : Gen ; n#1 : Num} ; -oper CN = {s : Num -> Str ; g : Gen} ; -oper NP = {s : Str ; a : Agr} ; +oper CN = {s#1 : Num -> Str ; g#0 : Gen} ; +oper NP = {s#1 : Str ; a#0 : Agr} ; oper artDef : Gen -> Str = \g -> table Gen { (Masc) => "le" ; @@ -14,29 +14,32 @@ oper artDef : Gen -> Str = \g -> table Gen { } ! $g ; lin Voiture : CN = { - s = table Num { + s#1 = table Num { (Sg) => "voiture" ; (Pl) => "voitures" } ; - g = (Fem@) + g#0 = (Fem@) } ; lin Bus : CN = { - s = table Num {$x => "bus"} ; - g = (Masc@) + s#1 = table Num {$x => "bus"} ; + g#0 = (Masc@) } ; lin Indef : CN -> NP = \cn -> { - s = table Gen { + s#1 = table Gen { (Masc) => "un" ; $x => "une" - } ! $cn.g ++ $cn.s ! (Sg@) ; - a = {g = $cn.g ; n = (Sg@)} + } ! $cn.g#0 ++ $cn.s#1 ! (Sg@) ; + a#0 = {g#0 = $cn.g#0 ; n#1 = (Sg@)} } ; lin Def : CN -> NP = \cn -> { - s = &artDef $cn.g ++ $cn.s ! (Sg@) ; - a = {g = $cn.g ; n = (Sg@)} + s#1 = &artDef $cn.g#0 ++ $cn.s#1 ! (Sg@) ; + a#0 = {g#0 = $cn.g#0 ; n#1 = (Sg@)} } ; + +lin UneVoiture : NP = Indef Voiture ; +lin LaVoiture : NP = Def Voiture ;