packages feed

BNFC-meta-0.6.1: examples/typesafe/Typesafe.hs

{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}


module Typesafe where

import Language.LBNF
  

bnfc [lbnf|

antiquote "[" ":" ":]" ;

 
Fun.      Prog     ::=  Ident "(" ")" "{" [Stm] "}" ;

SBAss.    Stm      ::= BVar ":=" BExp ";"  ;
SAss.     Stm      ::= NVar "=" Exp ";"  ;

SIncr.    Stm      ::= NVar "++" ";"  ;
SWhile.   Stm      ::= "while" "(" BExp ")" "{" [Stm] "}" ;
SBlock.   Stm      ::= "{" [Stm] "}" ;


 
EAnd.     BExp0     ::= BExp "&" BExp1 ;
ENeg.     BExp1     ::= "!" BExp1 ;
ELt.      BExp1     ::= Exp "<" Exp ;
ETruth.   BExp1     ::= Truth ;
EBVar.    BExp1     ::= BVar ;

EPlus.    Exp0     ::= Exp0 "+" Exp1 ;
ETimes.   Exp1     ::= Exp1 "*" Exp2 ;
EInt.     Exp2     ::= Integer ;
EVar.     Exp2     ::= NVar ;


TTrue.    Truth    ::= "True" ;
TFalse.   Truth    ::= "False" ;

[].       [Stm]    ::= ;
(:).      [Stm]    ::= Stm [Stm] ;

internal BVar. BVar ::= Ident ;
$ .             BVar ::= Ident ;

internal NVar. NVar ::= Ident ;
$.             NVar ::= Ident ;



-- coercions

_.        Stm      ::= Stm ";" ;

_.  Exp      ::= Exp0 ;
_.  Exp0     ::= Exp1 ;
_.  Exp1     ::= Exp2 ;
_.  Exp2     ::= "[" Exp "]" ;
-- _.  Exp2     ::= Exp3 ;


_.  BExp      ::= BExp0 ;
_.  BExp0     ::= BExp1 ;
_.  BExp1     ::= "(" BExp ")" ;



-- pragmas

comment "/*" "*/" ;
comment "//" ;

entrypoints Prog, Stm, Exp, BExp ;
  |]