annotate lisp/progmodes/ebnf-abn.el @ 89955:7f8b53f94713

Changes from arch/CVS synchronization
author Miles Bader <miles@gnu.org>
date Sat, 17 Jul 2004 05:09:07 +0000
parents 68c22ea6027c
children 4da4a09e8b1b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
89909
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1 ;;; ebnf-abn.el --- parser for ABNF (Augmented BNF)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
2
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
3 ;; Copyright (C) 2004 Free Sofware Foundation, Inc.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
4
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
5 ;; Author: Vinicius Jose Latorre <viniciusjl@ig.com.br>
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
6 ;; Maintainer: Vinicius Jose Latorre <viniciusjl@ig.com.br>
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
7 ;; Time-stamp: <2004/04/03 16:43:57 vinicius>
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
8 ;; Keywords: wp, ebnf, PostScript
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
9 ;; Version: 1.1
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
10
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
11 ;; This file is part of GNU Emacs.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
12
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
13 ;; GNU Emacs is free software; you can redistribute it and/or modify
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
14 ;; it under the terms of the GNU General Public License as published by
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
15 ;; the Free Software Foundation; either version 2, or (at your option)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
16 ;; any later version.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
17
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
18 ;; GNU Emacs is distributed in the hope that it will be useful,
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
21 ;; GNU General Public License for more details.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
22
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
23 ;; You should have received a copy of the GNU General Public License
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
24 ;; along with GNU Emacs; see the file COPYING. If not, write to the
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
25 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
26 ;; Boston, MA 02111-1307, USA.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
27
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
28 ;;; Commentary:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
29
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
30 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
31 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
32 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
33 ;; This is part of ebnf2ps package.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
34 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
35 ;; This package defines a parser for ABNF (Augmented BNF).
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
36 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
37 ;; See ebnf2ps.el for documentation.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
38 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
39 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
40 ;; ABNF Syntax
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
41 ;; -----------
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
42 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
43 ;; See the URL:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
44 ;; `http://www.ietf.org/rfc/rfc2234.txt'
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
45 ;; or
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
46 ;; `http://www.faqs.org/rfcs/rfc2234.html'
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
47 ;; or
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
48 ;; `http://www.rnp.br/ietf/rfc/rfc2234.txt'
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
49 ;; ("Augmented BNF for Syntax Specifications: ABNF").
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
50 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
51 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
52 ;; rulelist = 1*( rule / (*c-wsp c-nl) )
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
53 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
54 ;; rule = rulename defined-as elements c-nl
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
55 ;; ; continues if next line starts with white space
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
56 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
57 ;; rulename = ALPHA *(ALPHA / DIGIT / "-")
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
58 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
59 ;; defined-as = *c-wsp ("=" / "=/") *c-wsp
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
60 ;; ; basic rules definition and incremental
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
61 ;; ; alternatives
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
62 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
63 ;; elements = alternation *c-wsp
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
64 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
65 ;; c-wsp = WSP / (c-nl WSP)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
66 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
67 ;; c-nl = comment / CRLF
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
68 ;; ; comment or newline
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
69 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
70 ;; comment = ";" *(WSP / VCHAR) CRLF
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
71 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
72 ;; alternation = concatenation
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
73 ;; *(*c-wsp "/" *c-wsp concatenation)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
74 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
75 ;; concatenation = repetition *(1*c-wsp repetition)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
76 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
77 ;; repetition = [repeat] element
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
78 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
79 ;; repeat = 1*DIGIT / (*DIGIT "*" *DIGIT)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
80 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
81 ;; element = rulename / group / option /
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
82 ;; char-val / num-val / prose-val
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
83 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
84 ;; group = "(" *c-wsp alternation *c-wsp ")"
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
85 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
86 ;; option = "[" *c-wsp alternation *c-wsp "]"
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
87 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
88 ;; char-val = DQUOTE *(%x20-21 / %x23-7E) DQUOTE
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
89 ;; ; quoted string of SP and VCHAR without DQUOTE
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
90 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
91 ;; num-val = "%" (bin-val / dec-val / hex-val)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
92 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
93 ;; bin-val = "b" 1*BIT
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
94 ;; [ 1*("." 1*BIT) / ("-" 1*BIT) ]
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
95 ;; ; series of concatenated bit values
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
96 ;; ; or single ONEOF range
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
97 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
98 ;; dec-val = "d" 1*DIGIT
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
99 ;; [ 1*("." 1*DIGIT) / ("-" 1*DIGIT) ]
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
100 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
101 ;; hex-val = "x" 1*HEXDIG
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
102 ;; [ 1*("." 1*HEXDIG) / ("-" 1*HEXDIG) ]
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
103 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
104 ;; prose-val = "<" *(%x20-3D / %x3F-7E) ">"
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
105 ;; ; bracketed string of SP and VCHAR without
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
106 ;; ; angles
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
107 ;; ; prose description, to be used as last resort
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
108 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
109 ;; ; Core rules -- the coding depends on the system, here is used 7-bit ASCII
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
110 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
111 ;; ALPHA = %x41-5A / %x61-7A
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
112 ;; ; A-Z / a-z
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
113 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
114 ;; BIT = "0" / "1"
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
115 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
116 ;; CHAR = %x01-7F
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
117 ;; ; any 7-bit US-ASCII character, excluding NUL
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
118 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
119 ;; CR = %x0D
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
120 ;; ; carriage return
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
121 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
122 ;; CRLF = CR LF
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
123 ;; ; Internet standard newline
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
124 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
125 ;; CTL = %x00-1F / %x7F
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
126 ;; ; controls
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
127 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
128 ;; DIGIT = %x30-39
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
129 ;; ; 0-9
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
130 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
131 ;; DQUOTE = %x22
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
132 ;; ; " (Double Quote)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
133 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
134 ;; HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
135 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
136 ;; HTAB = %x09
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
137 ;; ; horizontal tab
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
138 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
139 ;; LF = %x0A
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
140 ;; ; linefeed
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
141 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
142 ;; LWSP = *(WSP / CRLF WSP)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
143 ;; ; linear white space (past newline)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
144 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
145 ;; OCTET = %x00-FF
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
146 ;; ; 8 bits of data
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
147 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
148 ;; SP = %x20
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
149 ;; ; space
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
150 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
151 ;; VCHAR = %x21-7E
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
152 ;; ; visible (printing) characters
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
153 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
154 ;; WSP = SP / HTAB
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
155 ;; ; white space
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
156 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
157 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
158 ;; NOTES:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
159 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
160 ;; 1. Rules name and terminal strings are case INSENSITIVE.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
161 ;; So, the following rule names are all equals:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
162 ;; Rule-name, rule-Name, rule-name, RULE-NAME
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
163 ;; Also, the following strings are equals:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
164 ;; "abc", "ABC", "aBc", "Abc", "aBC", etc.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
165 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
166 ;; 2. To have a case SENSITIVE string, use the character notation.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
167 ;; For example, to specify the lowercase string "abc", use:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
168 ;; %d97.98.99
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
169 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
170 ;; 3. There are no implicit spaces between elements, for example, the
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
171 ;; following rules:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
172 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
173 ;; foo = %x61 ; a
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
174 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
175 ;; bar = %x62 ; b
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
176 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
177 ;; mumble = foo bar foo
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
178 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
179 ;; Are equivalent to the following rule:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
180 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
181 ;; mumble = %x61.62.61
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
182 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
183 ;; If spaces are needed, it should be explicit specified, like:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
184 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
185 ;; spaces = 1*(%x20 / %x09) ; one or more spaces or tabs
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
186 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
187 ;; mumble = foo spaces bar spaces foo
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
188 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
189 ;; 4. Lines starting with space or tab are considered a continuation line.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
190 ;; For example, the rule:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
191 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
192 ;; rule = foo
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
193 ;; bar
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
194 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
195 ;; Is equivalent to:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
196 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
197 ;; rule = foo bar
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
198 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
199 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
200 ;; Differences Between ABNF And ebnf2ps ABNF
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
201 ;; -----------------------------------------
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
202 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
203 ;; Besides the characters that ABNF accepts, ebnf2ps ABNF accepts also the
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
204 ;; underscore (_) for rule name and european 8-bit accentuated characters (from
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
205 ;; \240 to \377) for rule name, string and comment.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
206 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
207 ;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
208 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
209
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
210 ;;; Code:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
211
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
212
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
213 (require 'ebnf-otz)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
214
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
215
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
216 (defvar ebnf-abn-lex nil
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
217 "Value returned by `ebnf-abn-lex' function.")
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
218
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
219
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
220 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
221 ;; Syntactic analyzer
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
222
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
223
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
224 ;;; rulelist = 1*( rule / (*c-wsp c-nl) )
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
225
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
226 (defun ebnf-abn-parser (start)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
227 "ABNF parser."
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
228 (let ((total (+ (- ebnf-limit start) 1))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
229 (bias (1- start))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
230 (origin (point))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
231 rule-list token rule)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
232 (goto-char start)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
233 (setq token (ebnf-abn-lex))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
234 (and (eq token 'end-of-input)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
235 (error "Invalid ABNF file format"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
236 (and (eq token 'end-of-rule)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
237 (setq token (ebnf-abn-lex)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
238 (while (not (eq token 'end-of-input))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
239 (ebnf-message-float
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
240 "Parsing...%s%%"
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
241 (/ (* (- (point) bias) 100.0) total))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
242 (setq token (ebnf-abn-rule token)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
243 rule (cdr token)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
244 token (car token))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
245 (or (ebnf-add-empty-rule-list rule)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
246 (setq rule-list (cons rule rule-list))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
247 (goto-char origin)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
248 rule-list))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
249
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
250
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
251 ;;; rule = rulename defined-as elements c-nl
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
252 ;;; ; continues if next line starts with white space
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
253 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
254 ;;; rulename = ALPHA *(ALPHA / DIGIT / "-")
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
255 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
256 ;;; defined-as = *c-wsp ("=" / "=/") *c-wsp
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
257 ;;; ; basic rules definition and incremental
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
258 ;;; ; alternatives
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
259 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
260 ;;; elements = alternation *c-wsp
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
261 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
262 ;;; c-wsp = WSP / (c-nl WSP)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
263 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
264 ;;; c-nl = comment / CRLF
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
265 ;;; ; comment or newline
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
266 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
267 ;;; comment = ";" *(WSP / VCHAR) CRLF
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
268
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
269
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
270 (defun ebnf-abn-rule (token)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
271 (let ((name ebnf-abn-lex)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
272 (action ebnf-action)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
273 elements)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
274 (setq ebnf-action nil)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
275 (or (eq token 'non-terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
276 (error "Invalid rule name"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
277 (setq token (ebnf-abn-lex))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
278 (or (memq token '(equal incremental-alternative))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
279 (error "Invalid rule: missing `=' or `=/'"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
280 (and (eq token 'incremental-alternative)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
281 (setq name (concat name " =/")))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
282 (setq elements (ebnf-abn-alternation))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
283 (or (memq (car elements) '(end-of-rule end-of-input))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
284 (error "Invalid rule: there is no end of rule"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
285 (setq elements (cdr elements))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
286 (ebnf-eps-add-production name)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
287 (cons (ebnf-abn-lex)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
288 (ebnf-make-production name elements action))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
289
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
290
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
291 ;;; alternation = concatenation
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
292 ;;; *(*c-wsp "/" *c-wsp concatenation)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
293
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
294
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
295 (defun ebnf-abn-alternation ()
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
296 (let (body concatenation)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
297 (while (eq (car (setq concatenation
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
298 (ebnf-abn-concatenation (ebnf-abn-lex))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
299 'alternative)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
300 (setq body (cons (cdr concatenation) body)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
301 (ebnf-token-alternative body concatenation)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
302
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
303
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
304 ;;; concatenation = repetition *(1*c-wsp repetition)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
305
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
306
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
307 (defun ebnf-abn-concatenation (token)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
308 (let ((term (ebnf-abn-repetition token))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
309 seq)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
310 (or (setq token (car term)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
311 term (cdr term))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
312 (error "Empty element"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
313 (setq seq (cons term seq))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
314 (while (setq term (ebnf-abn-repetition token)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
315 token (car term)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
316 term (cdr term))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
317 (setq seq (cons term seq)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
318 (cons token
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
319 (ebnf-token-sequence seq))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
320
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
321
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
322 ;;; repetition = [repeat] element
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
323 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
324 ;;; repeat = 1*DIGIT / (*DIGIT "*" *DIGIT)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
325
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
326
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
327 (defun ebnf-abn-repetition (token)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
328 (let (lower upper)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
329 ;; INTEGER [ "*" [ INTEGER ] ]
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
330 (when (eq token 'integer)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
331 (setq lower ebnf-abn-lex
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
332 token (ebnf-abn-lex))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
333 (or (eq token 'repeat)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
334 (setq upper lower)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
335 ;; "*" [ INTEGER ]
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
336 (when (eq token 'repeat)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
337 ;; only * ==> lower & upper are empty string
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
338 (or lower
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
339 (setq lower ""
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
340 upper ""))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
341 (when (eq (setq token (ebnf-abn-lex)) 'integer)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
342 (setq upper ebnf-abn-lex
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
343 token (ebnf-abn-lex))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
344 (let ((element (ebnf-abn-element token)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
345 (cond
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
346 ;; there is a repetition
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
347 (lower
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
348 (or element
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
349 (error "Missing element repetition"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
350 (setq token (ebnf-abn-lex))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
351 (cond
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
352 ;; one or more
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
353 ((and (string= lower "1") (null upper))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
354 (cons token (ebnf-make-one-or-more element)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
355 ;; zero or more
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
356 ((or (and (string= lower "0") (null upper))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
357 (and (string= lower "") (string= upper "")))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
358 (cons token (ebnf-make-zero-or-more element)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
359 ;; real repetition
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
360 (t
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
361 (ebnf-token-repeat lower (cons token element) upper))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
362 ;; there is an element
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
363 (element
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
364 (cons (ebnf-abn-lex) element))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
365 ;; something that caller has to deal
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
366 (t
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
367 (cons token nil))))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
368
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
369
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
370 ;;; element = rulename / group / option /
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
371 ;;; char-val / num-val / prose-val
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
372 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
373 ;;; group = "(" *c-wsp alternation *c-wsp ")"
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
374 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
375 ;;; option = "[" *c-wsp alternation *c-wsp "]"
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
376 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
377 ;;; char-val = DQUOTE *(%x20-21 / %x23-7E) DQUOTE
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
378 ;;; ; quoted string of SP and VCHAR without DQUOTE
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
379 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
380 ;;; num-val = "%" (bin-val / dec-val / hex-val)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
381 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
382 ;;; bin-val = "b" 1*BIT
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
383 ;;; [ 1*("." 1*BIT) / ("-" 1*BIT) ]
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
384 ;;; ; series of concatenated bit values
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
385 ;;; ; or single ONEOF range
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
386 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
387 ;;; dec-val = "d" 1*DIGIT
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
388 ;;; [ 1*("." 1*DIGIT) / ("-" 1*DIGIT) ]
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
389 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
390 ;;; hex-val = "x" 1*HEXDIG
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
391 ;;; [ 1*("." 1*HEXDIG) / ("-" 1*HEXDIG) ]
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
392 ;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
393 ;;; prose-val = "<" *(%x20-3D / %x3F-7E) ">"
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
394 ;;; ; bracketed string of SP and VCHAR without
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
395 ;;; ; angles
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
396 ;;; ; prose description, to be used as last resort
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
397
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
398
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
399 (defun ebnf-abn-element (token)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
400 (cond
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
401 ;; terminal
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
402 ((eq token 'terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
403 (ebnf-make-terminal ebnf-abn-lex))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
404 ;; non-terminal
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
405 ((eq token 'non-terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
406 (ebnf-make-non-terminal ebnf-abn-lex))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
407 ;; group
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
408 ((eq token 'begin-group)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
409 (let ((body (ebnf-abn-alternation)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
410 (or (eq (car body) 'end-group)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
411 (error "Missing `)'"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
412 (cdr body)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
413 ;; optional
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
414 ((eq token 'begin-optional)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
415 (let ((body (ebnf-abn-alternation)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
416 (or (eq (car body) 'end-optional)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
417 (error "Missing `]'"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
418 (ebnf-token-optional (cdr body))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
419 ;; no element
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
420 (t
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
421 nil)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
422 ))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
423
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
424
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
425 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
426 ;; Lexical analyzer
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
427
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
428
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
429 (defconst ebnf-abn-token-table (make-vector 256 'error)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
430 "Vector used to map characters to a lexical token.")
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
431
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
432
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
433 (defun ebnf-abn-initialize ()
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
434 "Initialize EBNF token table."
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
435 ;; control character & control 8-bit character are set to `error'
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
436 (let ((char ?\060))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
437 ;; digits: 0-9
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
438 (while (< char ?\072)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
439 (aset ebnf-abn-token-table char 'integer)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
440 (setq char (1+ char)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
441 ;; printable character: A-Z
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
442 (setq char ?\101)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
443 (while (< char ?\133)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
444 (aset ebnf-abn-token-table char 'non-terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
445 (setq char (1+ char)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
446 ;; printable character: a-z
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
447 (setq char ?\141)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
448 (while (< char ?\173)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
449 (aset ebnf-abn-token-table char 'non-terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
450 (setq char (1+ char)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
451 ;; European 8-bit accentuated characters:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
452 (setq char ?\240)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
453 (while (< char ?\400)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
454 (aset ebnf-abn-token-table char 'non-terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
455 (setq char (1+ char)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
456 ;; Override end of line characters:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
457 (aset ebnf-abn-token-table ?\n 'end-of-rule) ; [NL] linefeed
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
458 (aset ebnf-abn-token-table ?\r 'end-of-rule) ; [CR] carriage return
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
459 ;; Override space characters:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
460 (aset ebnf-abn-token-table ?\013 'space) ; [VT] vertical tab
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
461 (aset ebnf-abn-token-table ?\t 'space) ; [HT] horizontal tab
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
462 (aset ebnf-abn-token-table ?\ 'space) ; [SP] space
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
463 ;; Override form feed character:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
464 (aset ebnf-abn-token-table ?\f 'form-feed) ; [FF] form feed
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
465 ;; Override other lexical characters:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
466 (aset ebnf-abn-token-table ?< 'non-terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
467 (aset ebnf-abn-token-table ?% 'terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
468 (aset ebnf-abn-token-table ?\" 'terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
469 (aset ebnf-abn-token-table ?\( 'begin-group)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
470 (aset ebnf-abn-token-table ?\) 'end-group)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
471 (aset ebnf-abn-token-table ?* 'repeat)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
472 (aset ebnf-abn-token-table ?= 'equal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
473 (aset ebnf-abn-token-table ?\[ 'begin-optional)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
474 (aset ebnf-abn-token-table ?\] 'end-optional)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
475 (aset ebnf-abn-token-table ?/ 'alternative)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
476 ;; Override comment character:
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
477 (aset ebnf-abn-token-table ?\; 'comment)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
478
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
479
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
480 ;; replace the range "\240-\377" (see `ebnf-range-regexp').
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
481 (defconst ebnf-abn-non-terminal-chars
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
482 (ebnf-range-regexp "-_0-9A-Za-z" ?\240 ?\377))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
483 (defconst ebnf-abn-non-terminal-letter-chars
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
484 (ebnf-range-regexp "A-Za-z" ?\240 ?\377))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
485
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
486
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
487 (defun ebnf-abn-lex ()
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
488 "Lexical analyser for ABNF.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
489
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
490 Return a lexical token.
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
491
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
492 See documentation for variable `ebnf-abn-lex'."
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
493 (if (>= (point) ebnf-limit)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
494 'end-of-input
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
495 (let (token)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
496 ;; skip spaces and comments
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
497 (while (if (> (following-char) 255)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
498 (progn
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
499 (setq token 'error)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
500 nil)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
501 (setq token (aref ebnf-abn-token-table (following-char)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
502 (cond
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
503 ((eq token 'space)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
504 (skip-chars-forward " \013\t" ebnf-limit)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
505 (< (point) ebnf-limit))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
506 ((eq token 'comment)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
507 (ebnf-abn-skip-comment))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
508 ((eq token 'form-feed)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
509 (forward-char)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
510 (setq ebnf-action 'form-feed))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
511 ((eq token 'end-of-rule)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
512 (ebnf-abn-skip-end-of-rule))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
513 (t nil)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
514 )))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
515 (cond
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
516 ;; end of input
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
517 ((>= (point) ebnf-limit)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
518 'end-of-input)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
519 ;; error
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
520 ((eq token 'error)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
521 (error "Illegal character"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
522 ;; end of rule
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
523 ((eq token 'end-of-rule)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
524 'end-of-rule)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
525 ;; integer
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
526 ((eq token 'integer)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
527 (setq ebnf-abn-lex (ebnf-buffer-substring "0-9"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
528 'integer)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
529 ;; terminal: "string" or %[bdx]NNN((.NNN)+|-NNN)?
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
530 ((eq token 'terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
531 (setq ebnf-abn-lex
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
532 (if (= (following-char) ?\")
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
533 (ebnf-abn-string)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
534 (ebnf-abn-character)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
535 'terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
536 ;; non-terminal: NAME or <NAME>
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
537 ((eq token 'non-terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
538 (let ((prose-p (= (following-char) ?<)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
539 (when prose-p
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
540 (forward-char)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
541 (or (looking-at ebnf-abn-non-terminal-letter-chars)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
542 (error "Invalid prose value")))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
543 (setq ebnf-abn-lex
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
544 (ebnf-buffer-substring ebnf-abn-non-terminal-chars))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
545 (when prose-p
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
546 (or (= (following-char) ?>)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
547 (error "Invalid prose value"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
548 (setq ebnf-abn-lex (concat "<" ebnf-abn-lex ">"))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
549 'non-terminal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
550 ;; equal: =, =/
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
551 ((eq token 'equal)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
552 (forward-char)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
553 (if (/= (following-char) ?/)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
554 'equal
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
555 (forward-char)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
556 'incremental-alternative))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
557 ;; miscellaneous: (, ), [, ], /, *
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
558 (t
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
559 (forward-char)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
560 token)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
561 ))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
562
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
563
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
564 (defun ebnf-abn-skip-end-of-rule ()
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
565 (let (eor-p)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
566 (while (progn
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
567 ;; end of rule ==> 2 or more consecutive end of lines
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
568 (setq eor-p (or (> (skip-chars-forward "\r\n" ebnf-limit) 1)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
569 eor-p))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
570 ;; skip spaces
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
571 (skip-chars-forward " \013\t" ebnf-limit)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
572 ;; skip comments
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
573 (and (= (following-char) ?\;)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
574 (ebnf-abn-skip-comment))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
575 (not eor-p)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
576
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
577
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
578 ;; replace the range "\177-\237" (see `ebnf-range-regexp').
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
579 (defconst ebnf-abn-comment-chars
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
580 (ebnf-range-regexp "^\n\000-\010\016-\037" ?\177 ?\237))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
581
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
582
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
583 (defun ebnf-abn-skip-comment ()
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
584 (forward-char)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
585 (cond
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
586 ;; open EPS file
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
587 ((and ebnf-eps-executing (= (following-char) ?\[))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
588 (ebnf-eps-add-context (ebnf-abn-eps-filename)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
589 ;; close EPS file
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
590 ((and ebnf-eps-executing (= (following-char) ?\]))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
591 (ebnf-eps-remove-context (ebnf-abn-eps-filename)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
592 ;; any other action in comment
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
593 (t
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
594 (setq ebnf-action (aref ebnf-comment-table (following-char)))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
595 (skip-chars-forward ebnf-abn-comment-chars ebnf-limit))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
596 )
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
597 ;; check for a valid end of comment
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
598 (cond ((>= (point) ebnf-limit)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
599 nil)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
600 ((= (following-char) ?\n)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
601 t)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
602 (t
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
603 (error "Illegal character"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
604 ))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
605
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
606
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
607 (defun ebnf-abn-eps-filename ()
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
608 (forward-char)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
609 (ebnf-buffer-substring ebnf-abn-comment-chars))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
610
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
611
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
612 ;; replace the range "\240-\377" (see `ebnf-range-regexp').
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
613 (defconst ebnf-abn-string-chars
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
614 (ebnf-range-regexp " -!#-~" ?\240 ?\377))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
615
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
616
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
617 (defun ebnf-abn-string ()
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
618 (buffer-substring-no-properties
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
619 (progn
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
620 (forward-char)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
621 (point))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
622 (progn
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
623 (skip-chars-forward ebnf-abn-string-chars ebnf-limit)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
624 (or (= (following-char) ?\")
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
625 (error "Missing `\"'"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
626 (prog1
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
627 (point)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
628 (forward-char)))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
629
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
630
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
631 (defun ebnf-abn-character ()
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
632 ;; %[bdx]NNN((-NNN)|(.NNN)+)?
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
633 (buffer-substring-no-properties
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
634 (point)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
635 (progn
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
636 (forward-char)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
637 (let* ((char (following-char))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
638 (chars (cond ((or (= char ?B) (= char ?b)) "01")
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
639 ((or (= char ?D) (= char ?d)) "0-9")
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
640 ((or (= char ?X) (= char ?x)) "0-9A-Fa-f")
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
641 (t (error "Invalid terminal value")))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
642 (forward-char)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
643 (or (> (skip-chars-forward chars ebnf-limit) 0)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
644 (error "Invalid terminal value"))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
645 (if (= (following-char) ?-)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
646 (progn
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
647 (forward-char)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
648 (or (> (skip-chars-forward chars ebnf-limit) 0)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
649 (error "Invalid terminal value range")))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
650 (while (= (following-char) ?.)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
651 (forward-char)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
652 (or (> (skip-chars-forward chars ebnf-limit) 0)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
653 (error "Invalid terminal value")))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
654 (point))))
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
655
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
656
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
657 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
658
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
659
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
660 (provide 'ebnf-abn)
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
661
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
662 ;;; arch-tag: 8d1b3c4d-4226-4393-b9ae-b7ccf07cf779
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
663 ;;; ebnf-abn.el ends here