1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
; [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 ")"
|