; [ipl.sty]  indended programming language


Language ipl

Regular Grammar

; Character Set

  let Byte        = '\00' .. '\ff' ; all extended ascii
  let Control     = '\00' .. '\1f' ; control
                  |          '\7f' ; DEL
                  |          '\ff' ; space-like extended ascii

; Basic elements of tokens

  ign Space       = '\t '          ; ASCII - Space / Tab
  let Line        = '\n\r'         ; UNIX / CPM / DOS

  ign Etx         = "\1a" {Byte}   ; CPM / older DOS Versions

  let Digit       = '0' .. '9'
  let Letter      = 'a' .. 'z' | 'A' .. 'Z'

; comments & tokens
  
  com Comment     = "#" { Byte - Line } Line

  tok Ide         = Letter ( Letter | Digit | '_' )+

  tok Lit         = "\"" { ( Byte - '\"' ) | "\\\"" } "\""

  tok Nat         = Digit +

  tok Opr         = '+-*/,[]()=<>!$' | "||" | "&&" | "<=" | ">=" | "==" | "!="

  ind Blk         = Line { Space }

Context Free Grammar

start Pgm
:dfn : Funs

let Funs
:nil :
:cons: Stmt1 Funs

let Ids
:nil :
:cons: Ide Ids

let Vals
:nil :
:cons: Val Vals

let Stmts
:nil :
:cons: Stmt Stmts

let Val
:nat : Nat
:lit : Lit
:ide : Ide
:fun : Ide "(" Vals ")"

let Stmts1
:nil :
:ign0: "else" "\n " Stmts "\n"

let Stmt1
:fun : "fun" Ide "(" Ids ")" "\n " Stmts "\n"

let Stmt
:ign0: Stmt1
:retv: "return" Exp4
:letv: "let" Ide "=" Exp4
:cond: "if" Exp "\n " Stmts "\n" Stmts1
:loop: "while" Exp "\n " Stmts "\n"

let Exp
:and : Exp "or" Exp1
:ign0: Exp1

let Exp1
:and : Exp1 "and" Exp2
:not : "!" Exp2
:ign0: Exp2

let Exp2
:eq  : Exp2 "==" Exp3
:ne  : Exp2 "!=" Exp3
:lt  : Exp2 "<" Exp3
:gt  : Exp2 ">" Exp3
:le  : Exp2 "<=" Exp3
:ge  : Exp2 ">=" Exp3
:ign0: Exp3

let Exp3
:ign0: Val
:ign1: "(" Exp ")"

let Exp4
:add : Exp4 "+" Exp5
:sub : Exp4 "-" Exp5
:ign0: Exp5

let Exp5
:mul : Exp5 "*" Exp6
:div : Exp5 "/" Exp6
:ign0: Exp6

let Exp6
:ign0: Val
:ign1: "(" Exp4 ")"


