X-Git-Url: https://ruin.nu/git/?p=proglang.git;a=blobdiff_plain;f=syntax.cf;h=44a6cb4284db6eb0d08e95ec53423cccab7f8eb8;hp=bb046b882d380e6977c735c448a617e77843d01c;hb=HEAD;hpb=202e2865204a4e9ae1d880a8633e2c279557ad67 diff --git a/syntax.cf b/syntax.cf index bb046b8..44a6cb4 100644 --- a/syntax.cf +++ b/syntax.cf @@ -1,61 +1,119 @@ -- ordinary rules -BTrue. BoolT ::= "true" ; -BFalse. BoolT ::= "false" ; - -SDecl. Stm ::= Typ Ident ";" ; -SDeclAss. Stm ::= Typ Ident "=" Exp ";" ; -SExp. Stm ::= Exp ";" ; -SBlock. Stm ::= "{" [Stm] "}" ; -SIf. Stm ::= "if" "(" Exp ")" Stm ; -SIfE. Stm ::= "if" "(" Exp ")" Stm "else" Stm ; + +True. Bool ::= "true" ; +False. Bool ::= "false" ; + +TInt. Type ::= "int" ; +TBool. Type ::= "bool" ; + +Program. Program ::= [FuncStm] ; + + +SExp. Stm ::= Exp ";" ; +SBlock. Stm ::= "{" [Stm] "}" ; +SDecl. Stm ::= Type Ident "=" Exp ";" ; +SDeclD. Stm ::= Type Ident ";" ; + + SWhile. Stm ::= "while" "(" Exp ")" Stm ; +SIf. Stm ::= "if" "(" Exp ")" Stm "else" Stm ; +if. Stm ::= "if" "(" Exp ")" Stm ; +define if e s = SIf e s SNoop ; + -- SFor. Stm ::= "for" "(" Stm Exp ";" Exp ")" Stm ; SPrint. Stm ::= "print" Exp ";" ; --- VVar. Var ::= Ident ; --- VAss. Var ::= Ident "=" Exp; - -ELt. Exp ::= Exp1 "<" Exp1 ; -EELt. Exp ::= Exp1 "<=" Exp1 ; -EGt. Exp ::= Exp1 ">" Exp1 ; -EEGt. Exp ::= Exp1 ">=" Exp1 ; -EEq. Exp ::= Exp1 "==" Exp1 ; -ENEq. Exp ::= Exp1 "!=" Exp1 ; -EPlus. Exp1 ::= Exp1 "+" Exp2 ; -EMinus. Exp1 ::= Exp1 "-" Exp2 ; -ETimes. Exp2 ::= Exp2 "*" Exp3 ; -EDiv. Exp2 ::= Exp2 "/" Exp3 ; -EIncr. Exp3 ::= Ident "++" ; -EDecr. Exp3 ::= Ident "--" ; +SReturn. Stm ::= "return" Exp ";" ; + + + +EAss. Exp ::= Ident "=" Exp; + +compExp. Exp ::= Exp1 Op0 Exp1 ; +define compExp e1 o e2 = BiOpExp e1 o e2 ; + +op1. Exp1 ::= Exp1 Op1 Exp2 ; +define op1 e1 o e2 = BiOpExp e1 o e2 ; + +op2. Exp2 ::= Exp2 Op2 Exp3 ; +define op2 e1 o e2 = BiOpExp e1 o e2 ; + +postIncr. Exp3 ::= Ident "++" ; +define postIncr i = EPost i Plus ; + +postDecr. Exp3 ::= Ident "--" ; +define postDecr i = EPost i Minus ; + EVar. Exp3 ::= Ident ; -EAss. Exp3 ::= Ident "=" Exp; EInt. Exp3 ::= Integer ; +EBool. Exp3 ::= Bool ; + ENeg. Exp3 ::= "-" Exp3 ; -EBool. Exp3 ::= BoolT ; +ENot. Exp3 ::= "!" Exp3 ; + EReadI. Exp3 ::= "readInt" ; EReadB. Exp3 ::= "readBool" ; +EFunc. Exp3 ::= Ident "(" [Exp] ")" ; + + + coercions Exp 3 ; -_. Stm ::= Stm ";" ; +-- _. Stm ::= Stm ";" ; terminator Stm "" ; -Program. Stms ::= [Stm] ; +separator Exp "," ; + +Decl. Decl ::= Type Ident ; + +separator Decl "," ; +Func. Func ::= Type Ident "(" [Decl] ")" "{" [Stm] "}" ; + +separator Func "" ; + +S. FuncStm ::= Stm ; +F. FuncStm ::= Func ; + +separator FuncStm "" ; + +-- E1. Exps ::= Exp ; +-- E2. Exps ::= Exp "," Exps ; + +Lt. Op0 ::= "<" ; +ELt. Op0 ::= "<=" ; +Gt. Op0 ::= ">" ; +EGt. Op0 ::= ">=" ; +Eq. Op0 ::= "==" ; +NEq. Op0 ::= "!=" ; + +Plus. Op1 ::= "+" ; +Minus. Op1 ::= "-" ; +Times. Op2 ::= "*" ; +Div. Op2 ::= "/" ; + +_. Op ::= Op1; +_. Op ::= Op2; +_. Op ::= Op0; -TInt. Typ ::= "int" ; -TBool. Typ ::= "bool" ; -- pragmas -internal ExpT. Exp ::= Typ Exp ; +-- internal ExpT. Exp ::= Type Exp ; +-- internal EDefault. Exp ::= ; +internal BiOpExp. Exp ::= Exp Op Exp ; +-- internal NoType. Type ::= ; +internal EPost. Exp ::= Ident Op1 ; + +internal SNoop. Stm ::= ; comment "/*" "*/" ; comment "//" ; -entrypoints Stms, Exp ; +entrypoints Program;