module IBAF-Start
            
imports 
  IBAF-Expressions
  IBAF-Statements
  Funcons

// Language "IBAFlang"
    
lexical syntax // Language
  LEX-keyword = "else"
  LEX-keyword = "false"
  LEX-keyword = "if"
  LEX-keyword = "true"
  LEX-keyword = "while"
  LEX-keyword = "int"
  
syntax // Language
  
context-free syntax // Language
  L-start.L-start--L-pgm =
    L-pgm
  
  L-pgm.L-pgm--R-int-L-idlist-SEMI-L-stmt =
    "int" L-idlist ";" L-stmt
  
  L-idlist.L-idlist--L-id-C-COMMA-L-idlist-D-Q =
    L-id L-COMMA-L-idlist?
  
  L-COMMA-L-idlist.L-COMMA-L-idlist--COMMA-L-idlist =
    "," L-idlist
  
  
  L-keyword.LEX-keyword =
    LEX-keyword
  
context-free syntax // Semantics
  FCT.T-start =
    "start" "[:" L-start ":]"
  FCT.T-run =
    "run" "[:" L-pgm ":]"
  FCT-SEQ.T-declare-int-vars =
    "declare-int-vars" "[:" L-idlist ":]"
  FCT-Quoted.LEX-keyword = LEX-keyword
  
context-free syntax // Desugaring
  
variables // Meta-variables
  L-start = "(:START" [1-9]? ":)" {prefer}
  L-start? = "(:START" [1-9]? "?:)" {prefer}
  L-start* = "(:START" [1-9]? "*:)" {prefer}
  L-start+ = "(:START" [1-9]? "+:)" {prefer}
  L-pgm = "(:Pgm" [1-9]? ":)" {prefer}
  L-pgm? = "(:Pgm" [1-9]? "?:)" {prefer}
  L-pgm* = "(:Pgm" [1-9]? "*:)" {prefer}
  L-pgm+ = "(:Pgm" [1-9]? "+:)" {prefer}
  L-idlist = "(:IL" [1-9]? ":)" {prefer}
  L-idlist? = "(:IL" [1-9]? "?:)" {prefer}
  L-idlist* = "(:IL" [1-9]? "*:)" {prefer}
  L-idlist+ = "(:IL" [1-9]? "+:)" {prefer}
  
// SDF comments
  
  lexical syntax 
    LEX-id = LEX-keyword {reject}
  lexical restrictions
    LEX-id -/- [A-Za-z0-9]
  
  context-free syntax
  L-exp.L-exp--L-exp-PLUS-L-exp =
    L-exp "+" L-exp
    {assoc}
  L-exp.L-exp--L-exp-AMPERSAND-AMPERSAND-L-exp =
    L-exp "&&" L-exp
   {assoc}
  L-stmt.L-stmt--L-stmt-L-stmt =
    L-stmt L-stmt
        {right}
  
sorts // ASTs
  T-start
