This is the grammar for CLite, a small subset of a C/Java like language that include expressions, loops, assignment statements, and conditional statements. The non-terminal Program is the start symbol. Symbols that are bold and blue are EBNF symbols and not terminals (tokens) in CLite.

  Program         ⇒  int  main ( ) { Declarations Statements }
  Declarations    ⇒  { Declaration }
  Declaration     ⇒  Type  Identifier  ;
  Type            ⇒  int | bool | float | char
  Statements      ⇒  { Statement }
  Statement       ⇒  ; | Block | Assignment | IfStatement | WhileStatement
  Block           ⇒  { Statements }
  Assignment      ⇒  Identifier = Expression ;
  IfStatement     ⇒  if ( Expression ) Statement [ else Statement ]

  WhileStatement  ⇒  while ( Expression ) Statement  
  Expression      ⇒  Conjunction { || Conjunction }
  Conjunction     ⇒  Equality { && Equality }

  Equality        ⇒  Relation [ EquOp Relation ]
  EquOp           ⇒  == | != 
  Relation        ⇒  Addition [ RelOp Addition ]

  RelOp           ⇒  < | <= | > | >= 

  Addition        ⇒  Term { AddOp Term }
  AddOp           ⇒  + | -
  Term            ⇒  Factor { MulOp Factor }
  MulOp           ⇒  * | / | %
  Factor          ⇒  [ UnaryOp ] Primary
  UnaryOp         ⇒  - | !
  Primary         ⇒  Identifier | IntLit | FloatLit |  ( Expression )