File: ipl.sty

package info (click to toggle)
styx 1.7-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 13,324 kB
  • ctags: 5,329
  • sloc: ansic: 96,480; sh: 7,972; cpp: 1,572; makefile: 227; xml: 107; pascal: 15
file content (115 lines) | stat: -rw-r--r-- 1,869 bytes parent folder | download | duplicates (6)
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 ")"