]> ruin.nu Git - proglang.git/blobdiff - syntax.cf
minor change
[proglang.git] / syntax.cf
index 7e4740eaed3a448c6a2f8c3f7bc6dea7721c95ed..44a6cb4284db6eb0d08e95ec53423cccab7f8eb8 100644 (file)
--- a/syntax.cf
+++ b/syntax.cf
 
 -- ordinary rules
 
-BTrue. BoolT ::= "true" ;
-BFalse. BoolT ::= "false" ;
-
-SDecl.    Stm      ::= Typ Var ";" ;
---SAss.     Stm      ::= 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 "--" ;
-EVar.     Exp3    ::= Var ;
+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 ;
 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;