source: project/release/4/genturfahi/trunk/genturfahi.peg @ 22052

Last change on this file since 22052 was 22052, checked in by Alan Post, 10 years ago

genturfa'i: minor updates to grammar of PEG parser.

I noticed I still had #\space and #\tab hard-coded as space, which
existed because I hadn't yet defined [:space:].

Make some cosmetic changes to end of line and end of file handling.

File size: 9.0 KB
Line 
1;;;;
2;;;; genturfahi - lo la .ckim. ke pe'a jajgau ratcu ke'e genturfa'i
3;;;;            `-> A Scheme packrat parser.
4;;;;
5;;;; Copyright (c) 2010 ".alyn.post." <alyn.post@lodockikumazvati.org>
6;;;;
7;;;; Permission to use, copy, modify, and/or distribute this software for any
8;;;; purpose with or without fee is hereby granted, provided that the above
9;;;; copyright notice and this permission notice appear in all copies.
10;;;;
11;;;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12;;;; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13;;;; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14;;;; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15;;;; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16;;;; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17;;;; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18;;;;
19
20;;;
21;;; parser options.  The default values are commented out.
22;;;
23
24;; The name of the symbol the parser generator
25;; rules will be bound to in the output file.
26;;
27;{(define-name "gerna")}
28{(define-name "genturfahi-peg-gerna")}
29
30;; Enable debugging of the paser.
31;;
32;; Describe the parse as it occurs, including
33;; rule matches and failures, backtracking, memoization, &c.
34;;
35;; There may need to be a debug level.
36;;
37;{(debug #f)}
38
39;; Enable profiling of the parser.
40;;
41;; for each step in the parser, track:
42;;
43;;  * success or failure of rule
44;;  * memoization
45;;
46;{(profile #f)}
47
48;; Enable memoization of non-terminals.
49;;
50;;
51;{(memoize #t)}
52
53;{(sentinel #\nul)}
54
55;{(empty-list '())}
56
57;{(empty-string "")}
58
59;{(nonmatch-token #f)}
60
61cfari           <- canlu
62                   `cfari-samselpla*
63                   canlu
64                   #:gerna gerna
65                   `FAhO
66                -> samselpla-cfari
67
68; we want to execute header code before compiling the grammar.
69; this rule is here to associated a different code action with
70; header code than body code.
71;
72cfari-samselpla <- #\{ canlu #:rodalerfu (!#\} .)+ #\} canlu
73                -| samselpla-cfari-samselpla
74
75gerna           <- smuni*
76
77smuni           <- #:naselci naselci
78                   "<-"
79                   canlu
80                   #:javni javni
81                -> samselpla-smuni
82
83naselci         <- #:cfari [[:alnum:]$%:=>^~_@]
84                   #:fanmo [[:alnum:]$%:=>^~_@.!&/\-]*
85                   canlu
86                -> samselpla-naselci
87
88javni           <- jonai
89                 / je
90
91jonai           <- #:cfari je
92                   #:fanmo (#\/ canlu je)+
93                -> samselpla-jonai
94je              <- #:javni     nastura-pajavni+
95                   #:cmene     cmene-sumti?
96                   #:samselpla samselpla?
97                -> samselpla-je
98
99nastura-pajavni <- #\` canlu #:javni pajavni
100                -> samselpla-nastura-javni
101                 / pajavni
102
103pajavni         <- optional
104                 / zero-or-more
105                 / one-or-more
106                 / and-predicate
107                 / end-of-input
108                 / not-predicate
109                 / #:cmene cmene-sumti?
110                   #:javni selci-javni
111                -> samselpla-pajavni-cmene
112
113optional        <- #:cmene cmene-sumti?
114                   #:javni selci-javni
115                   #\?
116                   canlu
117                -> {samselpla-?}
118zero-or-more    <- #:cmene cmene-sumti?
119                   #:javni selci-javni
120                   #\*
121                   canlu
122                -> {samselpla-*}
123one-or-more     <- #:cmene cmene-sumti?
124                   #:javni selci-javni
125                   #\+
126                   canlu
127                -> {samselpla-+}
128and-predicate   <- #\&
129                   canlu
130                   #:javni selci-javni
131                -> {samselpla-&}
132end-of-input    <- #\! canlu #\. canlu
133                -> samselpla-fanmo
134not-predicate   <- #\!
135                   canlu
136                   #:javni selci-javni
137                -> {samselpla-!}
138
139cmene-sumti     <- "#:"
140                   #:cfari [[:alnum:]$%:=>^~_@]
141                   #:fanmo [[:alnum:]$%:=>^~_@.!&/\-]*
142                   canlu
143                -> samselpla-cmene-sumti
144
145selci-javni     <- selci-naselci
146                 / lerfu-selci
147                 / valsi-selci
148                 / klesi-selci
149                 / denpabu
150                 / girzu-javni
151
152selci-naselci   <- #:naselci naselci !"<-"
153                -> samselpla-selci-naselci
154
155lerfu-selci     <- ",#\\" #:lerfu lerfu-cmene canlu
156                -> samselpla-stura-lerfu-selci
157                 / ",#\\" #:lerfu .           canlu
158                -> samselpla-stura-lerfu-selci
159                 / "#\\"  #:lerfu lerfu-cmene canlu
160                -> samselpla-lerfu-selci
161                 / "#\\"  #:lerfu .           canlu
162                -> samselpla-lerfu-selci
163
164lerfu-cmene     <- "space"    -> samselpla-lerfu-space
165                 / "return"   -> samselpla-lerfu-return
166                 / "linefeed" -> samselpla-lerfu-linefeed
167                 / "newline"  -> samselpla-lerfu-newline
168                 / "return"   -> samselpla-lerfu-return
169                 / "tab"      -> samselpla-lerfu-tab
170
171valsi-selci     <- ",\"\""
172                   canlu
173                -> samselpla-stura-empty-string
174                 / "\"\""
175                   canlu
176                -> samselpla-empty-string
177                 / ",\""
178                   #:valsi-lerfu (!#\" valsi-lerfu)+
179                   #\"
180                   canlu
181                -> samselpla-stura-valsi-selci
182                 / #\"
183                   #:valsi-lerfu (!#\" valsi-lerfu)+
184                   #\"
185                   canlu
186                -> samselpla-valsi-selci
187valsi-lerfu     <- #\\ #\n        -> samselpla-valsi-newline
188                 / #\\ #\r        -> samselpla-valsi-linefeed
189                 / #\\ #\t        -> samselpla-valsi-tab
190                 / #\\ #\\        -> samselpla-valsi-backslash
191                 / #\\ #\'        -> samselpla-valsi-single-quote
192                 / #\\ #\"        -> samselpla-valsi-double-quote
193                 / !#\\ #:lerfu . -> samselpla-valsi-lerfu
194
195klesi-selci      <- #\[ #:klesi-lerfu klesi-lerfu+ "]*" canlu
196                 -> {samselpla-klesi-selci-*}
197                  / #\[ #:klesi-lerfu klesi-lerfu+ "]+" canlu
198                 -> {samselpla-klesi-selci-+}
199                  / #\[ #:klesi-lerfu klesi-lerfu+ #\]  canlu
200                 -> samselpla-klesi-selci
201
202klesi-lerfu      <- klesi-cmene
203                  / (!#\] #:klesi-lerfu . -> samselpla-klesi-lerfu)
204klesi-cmene     <- "[:alnum:]"   -> samselpla-alnum
205                 / "[:alpha:]"   -> samselpla-alpha
206                 / "[:ascii:]"   -> samselpla-ascii
207                 / "[:blank:]"   -> samselpla-blank
208                 / "[:cntrl:]"   -> samselpla-cntrl
209                 / "[:digit:]"   -> samselpla-digit
210                 / "[:graph:]"   -> samselpla-graph
211                 / "[:jbole'u:]" -> samselpla-jbolehu
212                 / "[:lower:]"   -> samselpla-lower
213                 / "[:odigit:]"  -> samselpla-odigit
214                 / "[:print:]"   -> samselpla-print
215                 / "[:punct:]"   -> samselpla-punct
216                 / "[:space:]"   -> samselpla-space
217                 / "[:upper:]"   -> samselpla-upper
218                 / "[:xdigit:]"  -> samselpla-xdigit
219                 / "[:^alnum:]"  -> samselpla-^alnum
220                 / "[:^alpha:]"  -> samselpla-^alpha
221                 / "[:^ascii:]"  -> samselpla-^ascii
222                 / "[:^blank:]"  -> samselpla-^blank
223                 / "[:^cntrl:]"  -> samselpla-^cntrl
224                 / "[:^digit:]"  -> samselpla-^digit
225                 / "[:^graph:]"  -> samselpla-^graph
226                 / "[:^lower:]"  -> samselpla-^lower
227                 / "[:^odigit:]" -> samselpla-^odigit
228                 / "[:^print:]"  -> samselpla-^print
229                 / "[:^punct:]"  -> samselpla-^punct
230                 / "[:^space:]"  -> samselpla-^space
231                 / "[:^upper:]"  -> samselpla-^upper
232                 / "[:^xdigit:]" -> samselpla-^xdigit
233
234denpabu         <- #\. canlu
235                -> samselpla-denpabu
236
237samselpla       <- "->"
238                   canlu
239                   ( samselpla-xadni
240                   / samselpla-cmene )
241                -> samselpla-samselpla-balvi
242                 / "-|"
243                   canlu
244                   ( samselpla-xadni
245                   / samselpla-cmene )
246                -> samselpla-samselpla-cabna
247
248samselpla-xadni <- #\{ canlu #:rodalerfu (!#\} .)+ #\} canlu
249                -> samselpla-samselpla-xadni
250
251samselpla-cmene <- #:cfari [[:alnum:]$%:=>^~_@]
252                   #:fanmo [[:alnum:]$%:=>^~_@.!&/\-]*
253                   canlu
254                -> samselpla-samselpla-cmene
255
256girzu-javni     <- "()" canlu
257                -> samselpla-empty-list
258                 / #\( canlu javni #\) canlu
259
260canlu           <- `(canlubu / totoi)*
261
262canlubu         <- [[:space:]]
263                 / CRLF
264totoi           <- #\; (!CRLF .)* (CRLF / &FAhO)
265
266CR              <- #\return
267LF              <- #\linefeed
268CRLF            <- CR LF / CR / LF
269
270FAhO            <- !.
Note: See TracBrowser for help on using the repository browser.