a5ad604bf5746e7f5b0f367c932f5eb3828d4556
[cl-opossum.git] / pegparser-boot.lisp
bloba5ad604bf5746e7f5b0f367c932f5eb3828d4556
1 ;; -*- mode:lisp -*-
2 (in-package :opossum)
3 (eval-when (:compile-toplevel :load-toplevel :execute)
4 (declaim (optimize (speed 0) (safety 3) (debug 3))))
5 (defun parse-file (f)
6 (let ((opossum:*context* (make-instance 'opossum:context :start-index 0
7 :destpkg *package*
8 :input (opossum:read-file f))))
9 (funcall (opossum::|parse_program|) 0)))
11 (DEFUN |parse_program| ()
12 (LAMBDA (opossum::OFFSET)
13 (opossum::BUILD-PARSER-FUNCTION "program"
14 (opossum::SEQ (opossum::MANY (|parse_ws|))
15 (opossum::MANY1
16 (|parse_rule|))
17 (LIST ':ACTION NIL
18 '|metapeg_action320|)))))
19 (DEFUN |parse_rule| ()
20 (LAMBDA (opossum::OFFSET)
21 (opossum::BUILD-PARSER-FUNCTION "rule"
22 (opossum::SEQ (|parse_id|)
23 (opossum::MANY (|parse_ws|))
24 (opossum::MATCH-STRING "<-")
25 (opossum::MANY (|parse_ws|))
26 (|parse_ordered-expr-list|)
27 (opossum::MANY
28 (|parse_ws_or_nl|))
29 (LIST ':ACTION NIL
30 '|metapeg_action321|)))))
31 (DEFUN |parse_ordered-expr-list| ()
32 (LAMBDA (opossum::OFFSET)
33 (opossum::BUILD-PARSER-FUNCTION "ordered-expr-list"
34 (opossum::EITHER
35 (opossum::SEQ (|parse_expr-list|)
36 (opossum::MANY (|parse_ws|))
37 (opossum::MATCH-STRING "/")
38 (opossum::MANY (|parse_ws|))
39 (|parse_ordered-expr-list|)
40 (LIST ':ACTION NIL
41 '|metapeg_action322|))
42 (opossum::SEQ (|parse_expr-list|)
43 (LIST ':ACTION NIL
44 '|metapeg_action323|))))))
45 (DEFUN |parse_expr-list| ()
46 (LAMBDA (opossum::OFFSET)
47 (opossum::BUILD-PARSER-FUNCTION "expr-list"
48 (opossum::SEQ (|parse_expr|)
49 (opossum::MANY
50 (opossum::SEQ
51 (opossum::MANY1
52 (|parse_ws|))
53 (|parse_expr-list|)))
54 (LIST ':ACTION NIL
55 '|metapeg_action324|)))))
56 (DEFUN |parse_expr| ()
57 (LAMBDA (opossum::OFFSET)
58 (opossum::BUILD-PARSER-FUNCTION "expr"
59 (opossum::EITHER
60 (opossum::SEQ (|parse_simple-expr|)
61 (opossum::MATCH-STRING "*")
62 (LIST ':ACTION NIL
63 '|metapeg_action325|))
64 (opossum::SEQ (|parse_simple-expr|)
65 (opossum::MATCH-STRING "+")
66 (LIST ':ACTION NIL
67 '|metapeg_action326|))
68 (opossum::SEQ (|parse_simple-expr|)
69 (opossum::MATCH-STRING "?")
70 (LIST ':ACTION NIL
71 '|metapeg_action327|))
72 (opossum::SEQ (|parse_simple-expr|)
73 (LIST ':ACTION NIL
74 '|metapeg_action328|))))))
75 (DEFUN |parse_simple-expr| ()
76 (LAMBDA (opossum::OFFSET)
77 (opossum::BUILD-PARSER-FUNCTION "simple-expr"
78 (opossum::EITHER
79 (opossum::SEQ (|parse_string|)
80 (LIST ':ACTION NIL
81 '|metapeg_action329|))
82 (|parse_action|)
83 (opossum::SEQ (opossum::MATCH-STRING "&")
84 (|parse_simple-expr|)
85 (LIST ':ACTION NIL
86 '|metapeg_action330|))
87 (opossum::SEQ (opossum::MATCH-STRING "@")
88 (|parse_id|)
89 (LIST ':action NIL
90 '|metapeg_action331|))
91 (opossum::SEQ (|parse_id|)
92 (LIST ':action NIL
93 '|metapeg_action332|))
94 (opossum::SEQ (|parse_bracketed-rule|)
95 (LIST ':action NIL
96 '|metapeg_action333|))
97 (opossum::MATCH-STRING "!.")
98 (opossum::SEQ (opossum::MATCH-STRING "!")
99 (|parse_expr|)
100 (LIST ':action NIL
101 '|metapeg_action334|))
102 (opossum::SEQ (|parse_character-class|)
103 (LIST ':action NIL
104 '|metapeg_action335|))
105 (opossum::SEQ (opossum::MATCH-STRING ".")
106 (LIST ':action NIL
107 '|metapeg_action336|))))))
108 (DEFUN |parse_bracketed-rule| ()
109 (LAMBDA (opossum::OFFSET)
110 (opossum::BUILD-PARSER-FUNCTION "bracketed-rule"
111 (opossum::EITHER
112 (opossum::MATCH-STRING "()")
113 (opossum::SEQ (opossum::MATCH-STRING "(")
114 (opossum::MANY (|parse_ws|))
115 (|parse_ordered-expr-list|)
116 (opossum::MANY (|parse_ws|))
117 (opossum::MATCH-STRING ")")
118 (LIST ':action NIL
119 '|metapeg_action337|))))))
120 (DEFUN |parse_id| ()
121 (LAMBDA (opossum::OFFSET)
122 (opossum::BUILD-PARSER-FUNCTION "id"
123 (opossum::SEQ
124 (opossum::MANY1
125 (opossum::MATCH-CHAR
126 '(#\A #\B #\C #\D #\E #\F #\G #\H #\I
127 #\J #\K #\L #\M #\N #\O #\P #\Q #\R
128 #\S #\T #\U #\V #\W #\X #\Y #\Z #\a
129 #\b #\c #\d #\e #\f #\g #\h #\i #\j
130 #\k #\l #\m #\n #\o #\p #\q #\r #\s
131 #\t #\u #\v #\w #\x #\y #\z #\- #\_)))
132 (LIST ':action NIL
133 '|metapeg_action338|)))))
134 (DEFUN |parse_character-class| ()
135 (LAMBDA (opossum::OFFSET)
136 (opossum::BUILD-PARSER-FUNCTION "character-class"
137 (opossum::SEQ (opossum::MATCH-STRING "[")
138 (opossum::MANY1
139 (opossum::SEQ
140 (|parse_not_right_bracket|)
141 (opossum::MATCH-ANY-CHAR)))
142 (opossum::MATCH-STRING "]")
143 (LIST ':action NIL
144 '|metapeg_action339|)))))
145 (DEFUN |parse_string| ()
146 (LAMBDA (opossum::OFFSET)
147 (opossum::BUILD-PARSER-FUNCTION "string"
148 (opossum::SEQ (opossum::MATCH-CHAR '(#\"))
149 (opossum::MANY
150 (opossum::SEQ
151 (opossum::NEGATE
152 (opossum::MATCH-CHAR
153 '(#\")))
154 (opossum::MATCH-ANY-CHAR)))
155 (opossum::MATCH-CHAR '(#\"))
156 (LIST ':action NIL
157 '|metapeg_action340|)))))
158 (DEFUN |parse_action| ()
159 (LAMBDA (opossum::OFFSET)
160 (opossum::BUILD-PARSER-FUNCTION "action"
161 (opossum::SEQ (opossum::MATCH-CHAR '(#\{))
162 (opossum::MANY
163 (opossum::SEQ
164 (opossum::NEGATE
165 (opossum::MATCH-CHAR
166 '(#\})))
167 (opossum::MATCH-ANY-CHAR)))
168 (opossum::MATCH-CHAR '(#\}))
169 (LIST ':action NIL
170 '|metapeg_action341|
171 *context*)))))
172 (DEFUN |parse_not_right_bracket| ()
173 (LAMBDA (opossum::OFFSET)
174 (opossum::BUILD-PARSER-FUNCTION "not_right_bracket"
175 (opossum::NEGATE
176 (opossum::MATCH-STRING "]")))))
177 (Defun |parse_comment| ()
178 (lambda (opossum::offset)
179 ;; ad-hoc comment handling addition to bootstrap ourselves
180 (opossum::BUILD-PARSER-FUNCTION "comment" (opossum::seq
181 (opossum::match-char '(#\#))
182 (opossum::many
183 (opossum::seq
184 (opossum::negate
185 (opossum::match-char '(#\Newline)))
186 (opossum::match-any-char)))
187 (opossum::optional
188 (opossum::match-char '(#\Newline)))))))
189 (DEFUN |parse_ws| ()
190 (LAMBDA (opossum::OFFSET)
191 (opossum::BUILD-PARSER-FUNCTION "ws" (opossum::either
192 (opossum::MATCH-CHAR '(#\Space #\Tab))
193 (|parse_comment|)))))
194 (DEFUN |parse_nl| ()
195 (LAMBDA (opossum::OFFSET)
196 (opossum::BUILD-PARSER-FUNCTION "nl" (opossum::MATCH-CHAR '(#\Newline)))))
197 (DEFUN |parse_ws_or_nl| ()
198 (LAMBDA (opossum::OFFSET)
199 (opossum::BUILD-PARSER-FUNCTION "ws_or_nl"
200 (opossum::EITHER (|parse_ws|)
201 (|parse_nl|)
202 ))))
205 (defun |metapeg_action341| (data)
206 (let* ((action-sans-{ (second data))
207 (action-code (coerce
208 ;; FIXME: fix escapes
209 (opossum::fix-escape-sequences
210 (mapcar #'second action-sans-{))
211 'string))
212 (ctx (fourth (fourth data)))
213 (action-name (make-action-name :ctx ctx)))
214 (store-action opossum:*context*
215 `(,action-name ,action-code))
216 `(list ':action nil ',action-name)))
218 (defun |metapeg_action340| (data) `(match-string ,(char-list-to-string (mapcar #'second (second data)))) )
220 (defun |metapeg_action339| (data)
221 ;; FIXME: this is character-class matching and needs to use cl-ppcre
222 `(opossum::match-char-class ,(coerce (mapcar #'second (second data)) 'string)))
224 (defun |metapeg_action338| (data) (char-list-to-string (first data)) )
225 (defun |metapeg_action337| (data) (third data) )
226 (defun |metapeg_action336| (data) (declare (ignore data)) `(match-any-char) )
227 (defun |metapeg_action335| (data) (first data) )
228 (defun |metapeg_action334| (data) `(negate ,(second data)) )
229 (defun |metapeg_action333| (data) (first data) )
230 (defun |metapeg_action332| (data)
231 `(,(make-name (first data)))
233 (defun |metapeg_action331| (data) `(match ,(second data)) )
234 (defun |metapeg_action330| (data) `(follow ,(second data)) )
235 (defun |metapeg_action329| (data) (first data) )
236 (defun |metapeg_action328| (data) (first data) )
237 (defun |metapeg_action327| (data) `(optional ,(first data)) )
238 (defun |metapeg_action326| (data) `(many1 ,(first data)) )
239 (defun |metapeg_action325| (data) `(many ,(first data)) )
240 (defun |metapeg_action324| (data) (if (or (equal (second data) "") (null (second data)))
241 (first data)
242 (let ((tail (second (first (second data)))))
243 (if (equal (first tail) 'seq)
244 `(seq ,(first data) ,@(rest tail))
245 `(seq ,(first data) ,tail)))) )
246 (defun |metapeg_action323| (data) (first data) )
247 (defun |metapeg_action322| (data)
248 (let ((tail (fifth data)))
249 (if (equal (first tail) 'either)
250 `(either ,(first data) ,@(rest tail))
251 `(either ,(first data) ,(fifth data))))
253 (defun |metapeg_action321| (data) `(defun ,(make-name (first data)) ()
254 (lambda (offset)
255 (build-parser-function ,(first data) ,(fifth data)))) )
256 (defun |metapeg_action320| (data)
257 `( ,@(second data))