Mercurial > emacs
annotate lisp/progmodes/ebnf-yac.el @ 69478:e8bb5df2ba7a
Add index entries around each paragraph rather than depend on entries
from beginning of node. Doing so ensures that index entries are less
likely to be forgotten if text is cut and pasted, and are necessary
anyway if the references are on a separate page. It seems that
makeinfo is now (v. 4.8) only producing one index entry per node, so
there is no longer any excuse not to. Use subheading instead of
heading. The incorrect use of heading produced very large fonts in
Info--as large as the main heading.
(From Bill Wohler): MH-E never did appear in Emacs 21--MH-E versions 6
and 7 appeared *around* the time of these Emacs releases.
author | Bill Wohler <wohler@newt.com> |
---|---|
date | Wed, 15 Mar 2006 00:26:12 +0000 |
parents | dc49655f57ae |
children | 8c9e156de392 4b3d39451150 |
rev | line source |
---|---|
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
34807
diff
changeset
|
1 ;;; ebnf-yac.el --- parser for Yacc/Bison |
27451 | 2 |
68773
dc49655f57ae
Update copyright for 2006.
Nick Roberts <nickrob@snap.net.nz>
parents:
64085
diff
changeset
|
3 ;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 |
54140
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
4 ;; Free Sofware Foundation, Inc. |
27451 | 5 |
54140
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
6 ;; Author: Vinicius Jose Latorre <viniciusjl@ig.com.br> |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
7 ;; Maintainer: Vinicius Jose Latorre <viniciusjl@ig.com.br> |
54714 | 8 ;; Time-stamp: <2004/04/03 16:50:46 vinicius> |
39344 | 9 ;; Keywords: wp, ebnf, PostScript |
54714 | 10 ;; Version: 1.3 |
27451 | 11 |
27539 | 12 ;; This file is part of GNU Emacs. |
27451 | 13 |
27539 | 14 ;; GNU Emacs is free software; you can redistribute it and/or modify |
27451 | 15 ;; it under the terms of the GNU General Public License as published by |
16 ;; the Free Software Foundation; either version 2, or (at your option) | |
17 ;; any later version. | |
18 | |
27539 | 19 ;; GNU Emacs is distributed in the hope that it will be useful, |
27451 | 20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
22 ;; GNU General Public License for more details. | |
23 | |
24 ;; You should have received a copy of the GNU General Public License | |
25 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
64085 | 26 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
27 ;; Boston, MA 02110-1301, USA. | |
27451 | 28 |
29 ;;; Commentary: | |
30 | |
31 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
32 ;; | |
33 ;; | |
34 ;; This is part of ebnf2ps package. | |
35 ;; | |
36 ;; This package defines a parser for Yacc/Bison. | |
37 ;; | |
38 ;; See ebnf2ps.el for documentation. | |
39 ;; | |
40 ;; | |
41 ;; Yacc/Bison Syntax | |
42 ;; ----------------- | |
43 ;; | |
44 ;; YACC = { YACC-Definitions }* "%%" { YACC-Rule }* [ "%%" [ YACC-Code ] ]. | |
45 ;; | |
54140
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
46 ;; YACC-Definitions = ( "%token" | "%left" | "%right" | "%nonassoc" ) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
47 ;; [ "<" Name ">" ] Name-List |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
48 ;; | "%prec" Name |
27451 | 49 ;; | "any other Yacc definition" |
50 ;; . | |
51 ;; | |
52 ;; YACC-Code = "any C definition". | |
53 ;; | |
54 ;; YACC-Rule = Name ":" Alternative ";". | |
55 ;; | |
56 ;; Alternative = { Sequence || "|" }*. | |
57 ;; | |
58 ;; Sequence = { Factor }*. | |
59 ;; | |
60 ;; Factor = Name | |
61 ;; | "'" "character" "'" | |
62 ;; | "error" | |
63 ;; | "{" "C like commands" "}" | |
64 ;; . | |
65 ;; | |
66 ;; Name-List = { Name || "," }*. | |
67 ;; | |
68 ;; Name = "[A-Za-z][A-Za-z0-9_.]*". | |
69 ;; | |
70 ;; Comment = "/*" "any character, but the sequence \"*/\"" "*/" | |
54208 | 71 ;; | "//" "any character, but the newline \"\\n\"" "\\n". |
27451 | 72 ;; |
73 ;; | |
54140
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
74 ;; In other words, a valid Name begins with a letter (upper or lower case) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
75 ;; followed by letters, decimal digits, underscore (_) or point (.). For |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
76 ;; example: this_is_a_valid.name, Another_EXAMPLE, mIxEd.CaSe. |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
77 ;; |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
78 ;; |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
79 ;; Acknowledgements |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
80 ;; ---------------- |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
81 ;; |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
82 ;; Thanks to Matthew K. Junker <junker@alum.mit.edu> for the suggestion to deal |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
83 ;; with %right, %left and %prec pragmas. His suggestion was extended to deal |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
84 ;; with %nonassoc pragma too. |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
85 ;; |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
86 ;; |
27451 | 87 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
88 | |
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
34807
diff
changeset
|
89 ;;; Code: |
27451 | 90 |
91 | |
92 (require 'ebnf-otz) | |
93 | |
94 | |
95 (defvar ebnf-yac-lex nil | |
96 "Value returned by `ebnf-yac-lex' function.") | |
97 | |
98 | |
99 (defvar ebnf-yac-token-list nil | |
100 "List of `%TOKEN' names.") | |
101 | |
102 | |
103 (defvar ebnf-yac-skip-char nil | |
104 "Non-nil means skip printable characters with no grammatical meaning.") | |
105 | |
106 | |
107 (defvar ebnf-yac-error nil | |
46275
0d5f7cc6ce91
(ebnf-yac-error): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents:
39424
diff
changeset
|
108 "Non-nil means \"error\" occurred.") |
27451 | 109 |
110 | |
111 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
49670
cc820064216c
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
46275
diff
changeset
|
112 ;; Syntactic analyzer |
27451 | 113 |
114 | |
115 ;;; YACC = { YACC-Definitions }* "%%" { YACC-Rule }* [ "%%" [ YACC-Code ] ]. | |
116 ;;; | |
117 ;;; YACC-Code = "any C definition". | |
118 | |
119 (defun ebnf-yac-parser (start) | |
120 "yacc/Bison parser." | |
121 (let ((total (+ (- ebnf-limit start) 1)) | |
122 (bias (1- start)) | |
123 (origin (point)) | |
124 syntax-list token rule) | |
125 (goto-char start) | |
126 (setq token (ebnf-yac-lex)) | |
127 (and (eq token 'end-of-input) | |
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
34807
diff
changeset
|
128 (error "Invalid Yacc/Bison file format")) |
27451 | 129 (or (eq (ebnf-yac-definitions token) 'yac-separator) |
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
34807
diff
changeset
|
130 (error "Missing `%%%%'")) |
27451 | 131 (setq token (ebnf-yac-lex)) |
132 (while (not (memq token '(end-of-input yac-separator))) | |
133 (ebnf-message-float | |
134 "Parsing...%s%%" | |
135 (/ (* (- (point) bias) 100.0) total)) | |
136 (setq token (ebnf-yac-rule token) | |
137 rule (cdr token) | |
138 token (car token)) | |
139 (or (ebnf-add-empty-rule-list rule) | |
140 (setq syntax-list (cons rule syntax-list)))) | |
141 (goto-char origin) | |
142 syntax-list)) | |
143 | |
144 | |
54140
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
145 ;;; YACC-Definitions = ( "%token" | "%left" | "%right" | "%nonassoc" ) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
146 ;;; [ "<" Name ">" ] Name-List |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
147 ;;; | "%prec" Name |
27451 | 148 ;;; | "any other Yacc definition" |
149 ;;; . | |
150 | |
151 (defun ebnf-yac-definitions (token) | |
152 (let ((ebnf-yac-skip-char t)) | |
153 (while (not (memq token '(yac-separator end-of-input))) | |
154 (setq token | |
155 (cond | |
54140
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
156 ;; ( "%token" | "%left" | "%right" | "%nonassoc" ) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
157 ;; [ "<" Name ">" ] Name-List |
27451 | 158 ((eq token 'yac-token) |
159 (setq token (ebnf-yac-lex)) | |
160 (when (eq token 'open-angle) | |
161 (or (eq (ebnf-yac-lex) 'non-terminal) | |
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
34807
diff
changeset
|
162 (error "Missing type name")) |
27451 | 163 (or (eq (ebnf-yac-lex) 'close-angle) |
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
34807
diff
changeset
|
164 (error "Missing `>'")) |
27451 | 165 (setq token (ebnf-yac-lex))) |
166 (setq token (ebnf-yac-name-list token) | |
167 ebnf-yac-token-list (nconc (cdr token) | |
168 ebnf-yac-token-list)) | |
169 (car token)) | |
54140
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
170 ;; "%prec" Name |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
171 ((eq token 'yac-prec) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
172 (or (eq (ebnf-yac-lex) 'non-terminal) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
173 (error "Missing prec name")) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
174 (ebnf-yac-lex)) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
175 ;; "any other Yacc definition" |
27451 | 176 (t |
177 (ebnf-yac-lex)) | |
178 ))) | |
179 token)) | |
180 | |
181 | |
182 ;;; YACC-Rule = Name ":" Alternative ";". | |
183 | |
184 (defun ebnf-yac-rule (token) | |
185 (let ((header ebnf-yac-lex) | |
186 (action ebnf-action) | |
187 body) | |
188 (setq ebnf-action nil) | |
189 (or (eq token 'non-terminal) | |
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
34807
diff
changeset
|
190 (error "Invalid rule name")) |
27451 | 191 (or (eq (ebnf-yac-lex) 'colon) |
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
34807
diff
changeset
|
192 (error "Invalid rule: missing `:'")) |
27451 | 193 (setq body (ebnf-yac-alternative)) |
194 (or (eq (car body) 'period) | |
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
34807
diff
changeset
|
195 (error "Invalid rule: missing `;'")) |
27451 | 196 (setq body (cdr body)) |
197 (ebnf-eps-add-production header) | |
198 (cons (ebnf-yac-lex) | |
199 (ebnf-make-production header body action)))) | |
200 | |
201 | |
202 ;;; Alternative = { Sequence || "|" }*. | |
203 | |
204 (defun ebnf-yac-alternative () | |
205 (let (body sequence) | |
206 (while (eq (car (setq sequence (ebnf-yac-sequence))) | |
207 'alternative) | |
208 (and (setq sequence (cdr sequence)) | |
209 (setq body (cons sequence body)))) | |
210 (ebnf-token-alternative body sequence))) | |
211 | |
212 | |
213 ;;; Sequence = { Factor }*. | |
214 | |
215 (defun ebnf-yac-sequence () | |
216 (let (ebnf-yac-error token seq factor) | |
217 (while (setq token (ebnf-yac-lex) | |
218 factor (ebnf-yac-factor token)) | |
219 (setq seq (cons factor seq))) | |
220 (cons token | |
54714 | 221 (if (and ebnf-yac-ignore-error-recovery ebnf-yac-error) |
222 ;; ignore error recovery | |
223 nil | |
224 (ebnf-token-sequence seq))))) | |
27451 | 225 |
226 | |
227 ;;; Factor = Name | |
228 ;;; | "'" "character" "'" | |
229 ;;; | "error" | |
230 ;;; | "{" "C like commands" "}" | |
231 ;;; . | |
232 | |
233 (defun ebnf-yac-factor (token) | |
234 (cond | |
235 ;; 'character' | |
236 ((eq token 'terminal) | |
237 (ebnf-make-terminal ebnf-yac-lex)) | |
238 ;; Name | |
239 ((eq token 'non-terminal) | |
240 (ebnf-make-non-terminal ebnf-yac-lex)) | |
241 ;; "error" | |
242 ((eq token 'yac-error) | |
243 (ebnf-make-special ebnf-yac-lex)) | |
244 ;; not a factor | |
245 (t | |
246 nil) | |
247 )) | |
248 | |
249 | |
250 ;;; Name-List = { Name || "," }*. | |
251 | |
252 (defun ebnf-yac-name-list (token) | |
253 (let (names) | |
254 (when (eq token 'non-terminal) | |
255 (while (progn | |
256 (setq names (cons ebnf-yac-lex names) | |
257 token (ebnf-yac-lex)) | |
258 (eq token 'comma)) | |
259 (or (eq (ebnf-yac-lex) 'non-terminal) | |
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
34807
diff
changeset
|
260 (error "Missing token name")))) |
27451 | 261 (cons token names))) |
262 | |
263 | |
264 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
265 ;; Lexical analyzer | |
266 | |
267 | |
268 ;;; Name = "[A-Za-z][A-Za-z0-9_.]*". | |
269 ;;; | |
270 ;;; Comment = "/*" "any character, but the sequence \"*/\"" "*/" | |
271 ;;; | "//" "any character" "\\n". | |
272 | |
273 (defconst ebnf-yac-token-table | |
274 ;; control character & 8-bit character are set to `error' | |
275 (let ((table (make-vector 256 'error))) | |
276 ;; upper & lower case letters: | |
277 (mapcar | |
278 #'(lambda (char) | |
279 (aset table char 'non-terminal)) | |
280 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") | |
281 ;; printable characters: | |
282 (mapcar | |
283 #'(lambda (char) | |
284 (aset table char 'character)) | |
285 "!#$&()*+-.0123456789=?@[\\]^_`~") | |
286 ;; Override space characters: | |
287 (aset table ?\n 'space) ; [NL] linefeed | |
288 (aset table ?\r 'space) ; [CR] carriage return | |
289 (aset table ?\t 'space) ; [HT] horizontal tab | |
290 (aset table ?\ 'space) ; [SP] space | |
291 ;; Override form feed character: | |
292 (aset table ?\f 'form-feed) ; [FF] form feed | |
293 ;; Override other lexical characters: | |
294 (aset table ?< 'open-angle) | |
295 (aset table ?> 'close-angle) | |
296 (aset table ?, 'comma) | |
297 (aset table ?% 'yac-pragma) | |
298 (aset table ?/ 'slash) | |
299 (aset table ?\{ 'yac-code) | |
300 (aset table ?\" 'string) | |
301 (aset table ?\' 'terminal) | |
302 (aset table ?: 'colon) | |
303 (aset table ?| 'alternative) | |
304 (aset table ?\; 'period) | |
305 table) | |
306 "Vector used to map characters to a lexical token.") | |
307 | |
308 | |
309 (defun ebnf-yac-initialize () | |
310 "Initializations for Yacc/Bison parser." | |
311 (setq ebnf-yac-token-list nil)) | |
312 | |
313 | |
314 (defun ebnf-yac-lex () | |
63632
174466935578
(ebnf-yac-lex): Fix spellings.
Juanma Barranquero <lekktu@gmail.com>
parents:
60917
diff
changeset
|
315 "Lexical analyzer for Yacc/Bison. |
27451 | 316 |
317 Return a lexical token. | |
318 | |
319 See documentation for variable `ebnf-yac-lex'." | |
320 (if (>= (point) ebnf-limit) | |
321 'end-of-input | |
322 (let (token) | |
323 ;; skip spaces, code blocks and comments | |
324 (while (if (> (following-char) 255) | |
325 (progn | |
326 (setq token 'error) | |
327 nil) | |
328 (setq token (aref ebnf-yac-token-table (following-char))) | |
329 (cond | |
330 ((or (eq token 'space) | |
331 (and ebnf-yac-skip-char | |
332 (eq token 'character))) | |
333 (ebnf-yac-skip-spaces)) | |
334 ((eq token 'yac-code) | |
335 (ebnf-yac-skip-code)) | |
336 ((eq token 'slash) | |
337 (ebnf-yac-handle-comment)) | |
338 ((eq token 'form-feed) | |
339 (forward-char) | |
340 (setq ebnf-action 'form-feed)) | |
341 (t nil) | |
342 ))) | |
343 (cond | |
344 ;; end of input | |
345 ((>= (point) ebnf-limit) | |
346 'end-of-input) | |
347 ;; error | |
348 ((eq token 'error) | |
60917
87f9bb9d3718
* progmodes/ebnf-abn.el, progmodes/ebnf-bnf.el,
Werner LEMBERG <wl@gnu.org>
parents:
54714
diff
changeset
|
349 (error "Invalid character")) |
27451 | 350 ;; "string" |
351 ((eq token 'string) | |
352 (setq ebnf-yac-lex (ebnf-get-string)) | |
353 'string) | |
354 ;; terminal: 'char' | |
355 ((eq token 'terminal) | |
356 (setq ebnf-yac-lex (ebnf-string " -&(-~" ?\' "terminal")) | |
357 'terminal) | |
358 ;; non-terminal, terminal or "error" | |
359 ((eq token 'non-terminal) | |
360 (setq ebnf-yac-lex (ebnf-buffer-substring "0-9A-Za-z_.")) | |
361 (cond ((member ebnf-yac-lex ebnf-yac-token-list) | |
362 'terminal) | |
363 ((string= ebnf-yac-lex "error") | |
364 (setq ebnf-yac-error t) | |
365 'yac-error) | |
366 (t | |
367 'non-terminal) | |
368 )) | |
369 ;; %% and Yacc pragmas (%TOKEN, %START, etc). | |
370 ((eq token 'yac-pragma) | |
371 (forward-char) | |
372 (cond | |
373 ;; Yacc separator | |
374 ((eq (following-char) ?%) | |
375 (forward-char) | |
376 'yac-separator) | |
54140
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
377 ;; %TOKEN, %RIGHT, %LEFT, %PREC, %NONASSOC |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
378 ((cdr (assoc (upcase (ebnf-buffer-substring "0-9A-Za-z_")) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
379 '(("TOKEN" . yac-token) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
380 ("RIGHT" . yac-token) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
381 ("LEFT" . yac-token) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
382 ("NONASSOC" . yac-token) |
766aaa5bded5
ABNF parser. Fix bug on productions like test = {"test"}* | ("tt" ["test"]). Reported by Markus Dreyer.
Vinicius Jose Latorre <viniciusjl@ig.com.br>
parents:
52401
diff
changeset
|
383 ("PREC" . yac-prec))))) |
27451 | 384 ;; other Yacc pragmas |
385 (t | |
386 'yac-pragma) | |
387 )) | |
388 ;; miscellaneous | |
389 (t | |
390 (forward-char) | |
391 token) | |
392 )))) | |
393 | |
394 | |
395 (defun ebnf-yac-skip-spaces () | |
396 (skip-chars-forward | |
397 (if ebnf-yac-skip-char | |
398 "\n\r\t !#$&()*+-.0123456789=?@[\\\\]^_`~" | |
399 "\n\r\t ") | |
400 ebnf-limit) | |
401 (< (point) ebnf-limit)) | |
402 | |
403 | |
39424
b7142e063fee
Fix character range regexp. Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents:
39344
diff
changeset
|
404 ;; replace the range "\177-\377" (see `ebnf-range-regexp'). |
b7142e063fee
Fix character range regexp. Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents:
39344
diff
changeset
|
405 (defconst ebnf-yac-skip-chars |
b7142e063fee
Fix character range regexp. Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents:
39344
diff
changeset
|
406 (ebnf-range-regexp "^{}/'\"\000-\010\013\016-\037" ?\177 ?\377)) |
b7142e063fee
Fix character range regexp. Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents:
39344
diff
changeset
|
407 |
b7142e063fee
Fix character range regexp. Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents:
39344
diff
changeset
|
408 |
27451 | 409 (defun ebnf-yac-skip-code () |
410 (forward-char) | |
411 (let ((pair 1)) | |
412 (while (> pair 0) | |
39424
b7142e063fee
Fix character range regexp. Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents:
39344
diff
changeset
|
413 (skip-chars-forward ebnf-yac-skip-chars ebnf-limit) |
27451 | 414 (cond |
415 ((= (following-char) ?{) | |
416 (forward-char) | |
417 (setq pair (1+ pair))) | |
418 ((= (following-char) ?}) | |
419 (forward-char) | |
420 (setq pair (1- pair))) | |
421 ((= (following-char) ?/) | |
422 (ebnf-yac-handle-comment)) | |
423 ((= (following-char) ?\") | |
424 (ebnf-get-string)) | |
425 ((= (following-char) ?\') | |
426 (ebnf-string " -&(-~" ?\' "character")) | |
427 (t | |
60917
87f9bb9d3718
* progmodes/ebnf-abn.el, progmodes/ebnf-bnf.el,
Werner LEMBERG <wl@gnu.org>
parents:
54714
diff
changeset
|
428 (error "Invalid character")) |
27451 | 429 ))) |
430 (ebnf-yac-skip-spaces)) | |
431 | |
432 | |
433 (defun ebnf-yac-handle-comment () | |
434 (forward-char) | |
435 (cond | |
436 ;; begin comment | |
437 ((= (following-char) ?*) | |
438 (ebnf-yac-skip-comment) | |
439 (ebnf-yac-skip-spaces)) | |
440 ;; line comment | |
441 ((= (following-char) ?/) | |
442 (end-of-line) | |
443 (ebnf-yac-skip-spaces)) | |
444 ;; no comment | |
445 (t nil) | |
446 )) | |
447 | |
448 | |
34807
05c7152c7aeb
Fix the same problem as described on ebnf2ps.el log
Gerd Moellmann <gerd@gnu.org>
parents:
27539
diff
changeset
|
449 ;; replace the range "\177-\237" (see `ebnf-range-regexp'). |
05c7152c7aeb
Fix the same problem as described on ebnf2ps.el log
Gerd Moellmann <gerd@gnu.org>
parents:
27539
diff
changeset
|
450 (defconst ebnf-yac-comment-chars |
05c7152c7aeb
Fix the same problem as described on ebnf2ps.el log
Gerd Moellmann <gerd@gnu.org>
parents:
27539
diff
changeset
|
451 (ebnf-range-regexp "^*\000-\010\013\016-\037" ?\177 ?\237)) |
27451 | 452 |
453 | |
454 (defun ebnf-yac-skip-comment () | |
455 (forward-char) | |
456 (cond | |
457 ;; open EPS file | |
458 ((and ebnf-eps-executing (= (following-char) ?\[)) | |
459 (ebnf-eps-add-context (ebnf-yac-eps-filename))) | |
460 ;; close EPS file | |
461 ((and ebnf-eps-executing (= (following-char) ?\])) | |
462 (ebnf-eps-remove-context (ebnf-yac-eps-filename))) | |
463 ;; any other action in comment | |
464 (t | |
465 (setq ebnf-action (aref ebnf-comment-table (following-char)))) | |
466 ) | |
467 (let ((not-end t)) | |
468 (while not-end | |
469 (skip-chars-forward ebnf-yac-comment-chars ebnf-limit) | |
470 (cond ((>= (point) ebnf-limit) | |
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
34807
diff
changeset
|
471 (error "Missing end of comment: `*/'")) |
27451 | 472 ((= (following-char) ?*) |
473 (skip-chars-forward "*" ebnf-limit) | |
474 (when (= (following-char) ?/) | |
475 ;; end of comment | |
476 (forward-char) | |
477 (setq not-end nil))) | |
478 (t | |
60917
87f9bb9d3718
* progmodes/ebnf-abn.el, progmodes/ebnf-bnf.el,
Werner LEMBERG <wl@gnu.org>
parents:
54714
diff
changeset
|
479 (error "Invalid character")) |
27451 | 480 )))) |
481 | |
482 | |
483 (defun ebnf-yac-eps-filename () | |
484 (forward-char) | |
485 (buffer-substring-no-properties | |
486 (point) | |
487 (let ((chars (concat ebnf-yac-comment-chars "\n")) | |
488 found) | |
489 (while (not found) | |
490 (skip-chars-forward chars ebnf-limit) | |
491 (setq found | |
492 (cond ((>= (point) ebnf-limit) | |
493 (point)) | |
494 ((= (following-char) ?*) | |
495 (skip-chars-forward "*" ebnf-limit) | |
496 (if (/= (following-char) ?\/) | |
497 nil | |
498 (backward-char) | |
499 (point))) | |
500 (t | |
501 (point)) | |
502 ))) | |
503 found))) | |
504 | |
505 | |
506 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
507 | |
508 | |
509 (provide 'ebnf-yac) | |
510 | |
511 | |
52401 | 512 ;;; arch-tag: 8a96989c-0b1d-42ba-a020-b2901f9a2a4d |
27451 | 513 ;;; ebnf-yac.el ends here |