/
ConcSyn.pco
123 lines (122 loc) · 8.3 KB
/
ConcSyn.pco
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
116
117
118
119
120
121
122
123
`*-----------------------------------*`
`* >>>Pico 2.0<<< *`
`* Theo D'Hondt *`
`* VUB Programming Technology Lab *`
`* ©2002 *`
`*-----------------------------------*`
`* concrete syntax *`
`* (METACIRCULAR VERSION) *`
`*-----------------------------------*`
`---------------------------------------------------------------------`
` program ::= expression `
` `
` expression ::= operation [ definition | `
` declaration | `
` assignment ] `
` `
` definition ::= : expression `
` `
` declaration ::= :: expression `
` `
` assignment ::= := expression `
` `
` operation ::= comparand { comparator comparand } `
` `
` comparand ::= term { adder term } `
` `
` term ::= factor { multiplier factor } `
` `
` factor ::= operand { power operand } `
` `
` operand ::= reference | table | subexpression `
` `
` reference ::= number | fraction | text | quotation `
` begin | prefix | variable `
` `
` table ::= [ [ commalist ] ] invocation `
` `
` subexpression ::= ( expression ) invocation `
` `
` number ::= number `
` `
` fraction ::= fraction `
` `
` text ::= text `
` `
` quotation ::= ' expression `
` `
` begin ::= { semicolonlist } invocation `
` `
` prefix ::= operator ( [ reference ] | invocation ) `
` `
` variable ::= name invocation `
` `
` invocation ::= [ ( application | `
` apply | `
` tabulation | `
` qualification ) invocation ] `
` `
` application ::= ( [ commalist ] ) `
` `
` apply ::= @ operand `
` `
` tabulation ::= [ commalist ] `
` `
` qualification ::= . qualifier `
` [ application | apply | tabulation ] `
` `
` semicolonlist ::= expression { ; expression } `
` `
` commalist ::= expression { , expression } `
` `
` qualifier ::= name | operator `
` `
` name ::= name `
` `
` operator ::= operator `
` `
`---------------------------------------------------------------------`
` `
` comparator ::= #comparator# { #operator# } `
` `
` adder ::= #adder# { #operator# } `
` `
` multiplier ::= #multiplier# { #operator# } `
` `
` power ::= #power# { #operator# } `
` `
` operator ::= #operator# { #operator# } `
` `
` number ::= #digit# { #digit# } `
` `
` fraction ::= number ( . number [ scale ] | scale ) `
` `
` scale ::= #exponent# [ + | - ] number `
` `
` text ::= " { #noquo# } " `
` `
` name ::= #letter# { #letter# | #digit# } `
` `
`---------------------------------------------------------------------`
` `
` #end# = { <0> } `
` #eoln# = { <13> } `
` #tab# = { <9> } `
` #space# = { <32> } `
` #quote# = { " } `
` #backquote# = { ` } `
` #printable# = { <32> ,..., <255> } `
` #letter# = { a ,..., z , A ,..., Z , _ } `
` #digit# = { 0 ,..., 9 } `
` #exponent# = { e , E } `
` #comparator# = { < , = , > , # , ~ } `
` #adder# = { $ , % , + , - , | } `
` #multiplier# = { & , * , / , \ } `
` #power# = { ! , ? , ^ } `
` #comment# = #backquote# #nobackquo# * #backquote# `
` #whitespace# = #space# + #comment# + #tab# + #eoln# + #end# `
` #operator# = #comparator# + #adder# + #multiplier# + #power# `
` #noquo# = #printable# - #quote# `
` #nobackquo# = #printable# - #backquote# `
` `
`---------------------------------------------------------------------`