bibtex-ruby 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of bibtex-ruby might be problematic. Click here for more details.
- data.tar.gz.sig +0 -0
- data/History.txt +3 -0
- data/LICENSE +621 -0
- data/Manifest +34 -0
- data/README.rdoc +152 -0
- data/Rakefile +54 -0
- data/bibtex-ruby.gemspec +36 -0
- data/examples/bib2html.rb +28 -0
- data/examples/markdown.bib +39 -0
- data/lib/bibtex.rb +51 -0
- data/lib/bibtex/bibliography.rb +175 -0
- data/lib/bibtex/bibtex.y +129 -0
- data/lib/bibtex/elements.rb +262 -0
- data/lib/bibtex/entry.rb +154 -0
- data/lib/bibtex/error.rb +37 -0
- data/lib/bibtex/lexer.rb +328 -0
- data/lib/bibtex/parser.output +578 -0
- data/lib/bibtex/parser.rb +467 -0
- data/lib/bibtex/string_replacement.rb +43 -0
- data/lib/extensions/core.rb +35 -0
- data/test/bib/00_empty.bib +0 -0
- data/test/bib/01_no_bibtex.bib +9 -0
- data/test/bib/02_string.bib +1 -0
- data/test/bib/03_string.bib +26 -0
- data/test/bib/04_string_replacement.bib +16 -0
- data/test/bib/05_comment.bib +15 -0
- data/test/bib/06_preamble.bib +12 -0
- data/test/bib/07_entry.bib +20 -0
- data/test/bib/08_decoret.bib +83 -0
- data/test/bib/09_errors.bib +67 -0
- data/test/bib/10_bibdesk.bib +47 -0
- data/test/test_bibtex.rb +58 -0
- data/test/test_comment.rb +24 -0
- data/test/test_entry.rb +35 -0
- data/test/test_preamble.rb +24 -0
- data/test/test_string.rb +77 -0
- metadata +155 -0
- metadata.gz.sig +0 -0
data/lib/bibtex/error.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
module BibTeX
|
2
|
+
|
3
|
+
#
|
4
|
+
# Represents a lexical or syntactical error.
|
5
|
+
#
|
6
|
+
class Error < Element
|
7
|
+
|
8
|
+
attr_reader :trace
|
9
|
+
|
10
|
+
def initialize(trace=[])
|
11
|
+
@trace = trace
|
12
|
+
end
|
13
|
+
|
14
|
+
def trace=(trace)
|
15
|
+
raise(ArgumentError, "BibTeX::Error trace must be of type Array; was: #{trace.class.name}.") unless trace.kind_of?(Array)
|
16
|
+
@trace = trace
|
17
|
+
end
|
18
|
+
|
19
|
+
def content
|
20
|
+
@trace.map { |e| e[1] }.join
|
21
|
+
end
|
22
|
+
|
23
|
+
# Called when the element was added to a bibliography.
|
24
|
+
def added_to_bibliography(bibliography)
|
25
|
+
super(bibliography)
|
26
|
+
bibliography.errors << self
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
# Called when the element was removed from a bibliography.
|
31
|
+
def removed_from_bibliography(bibliography)
|
32
|
+
super(bibliography)
|
33
|
+
bibliography.errors.delete(self)
|
34
|
+
self
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/bibtex/lexer.rb
ADDED
@@ -0,0 +1,328 @@
|
|
1
|
+
#--
|
2
|
+
# BibTeX-Ruby
|
3
|
+
# Copyright (C) 2010 Sylvester Keil <http://sylvester.keil.or.at>
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
require 'strscan'
|
20
|
+
|
21
|
+
|
22
|
+
module BibTeX
|
23
|
+
|
24
|
+
#
|
25
|
+
# The BibTeX::Lexer handles the lexical analysis of BibTeX bibliographies.
|
26
|
+
#
|
27
|
+
class Lexer
|
28
|
+
|
29
|
+
attr_reader :src, :options, :stack
|
30
|
+
|
31
|
+
#
|
32
|
+
# Creates a new instance. Possible options and their respective
|
33
|
+
# default values are:
|
34
|
+
#
|
35
|
+
# - :include => [:errors] A list that may contain :meta_comments, and
|
36
|
+
# :errors; depending on whether or not these are present, the respective
|
37
|
+
# tokens are included in the parse tree.
|
38
|
+
# - :strict => true In strict mode objects can start anywhere; therefore
|
39
|
+
# the `@' symbol is not possible except inside literals or @comment
|
40
|
+
# objects; for a more lenient lexer set to false and objects are
|
41
|
+
# expected to start after a new line (leading white space is permitted).
|
42
|
+
#
|
43
|
+
def initialize(options={})
|
44
|
+
@options = options
|
45
|
+
@options[:include] ||= [:errors]
|
46
|
+
@options[:strict] = true unless @options.has_key?(:strict)
|
47
|
+
@src = nil
|
48
|
+
end
|
49
|
+
|
50
|
+
# Sets the source for the lexical analysis and resets the internal state.
|
51
|
+
def src=(src)
|
52
|
+
@stack = []
|
53
|
+
@brace_level = 0
|
54
|
+
@mode = :meta
|
55
|
+
@active_object = nil
|
56
|
+
@src = StringScanner.new(src)
|
57
|
+
@line_breaks = []
|
58
|
+
@line_breaks << @src.pos until @src.scan_until(/\n|$/).empty?
|
59
|
+
@src.reset
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns the line number at a given position in the source.
|
63
|
+
def line_number_at(index)
|
64
|
+
(@line_breaks.find_index { |n| n >= index } || 0) + 1
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns the next token from the parse stack.
|
68
|
+
def next_token
|
69
|
+
@stack.shift
|
70
|
+
end
|
71
|
+
|
72
|
+
def mode=(mode)
|
73
|
+
Log.debug("Lexer: switching to #{mode} mode...")
|
74
|
+
|
75
|
+
@active_object = case
|
76
|
+
when [:comment,:string,:preamble,:entry].include?(mode) then mode
|
77
|
+
when mode == :meta then nil
|
78
|
+
else @active_object
|
79
|
+
end
|
80
|
+
|
81
|
+
@mode = mode
|
82
|
+
end
|
83
|
+
|
84
|
+
def mode
|
85
|
+
@mode
|
86
|
+
end
|
87
|
+
|
88
|
+
# Returns true if the lexer is currenty parsing a BibTeX object.
|
89
|
+
def bibtex_mode?
|
90
|
+
[:bibtex,:comment,:string,:preamble,:entry].include?(self.mode)
|
91
|
+
end
|
92
|
+
|
93
|
+
# Returns true if the lexer is currently parsing meta comments.
|
94
|
+
def meta_mode?
|
95
|
+
self.mode == :meta
|
96
|
+
end
|
97
|
+
|
98
|
+
# Returns true if the lexer is currently parsing a braced-out expression.
|
99
|
+
def content_mode?
|
100
|
+
self.mode == :content
|
101
|
+
end
|
102
|
+
|
103
|
+
# Returns true if the lexer is currently parsing a string literal.
|
104
|
+
def literal_mode?
|
105
|
+
self.mode == :literal
|
106
|
+
end
|
107
|
+
|
108
|
+
# Returns true if the lexer is currently parsing the given object type.
|
109
|
+
def is_active?(object)
|
110
|
+
@active_object == object
|
111
|
+
end
|
112
|
+
|
113
|
+
# Pushes a value onto the parse stack.
|
114
|
+
def push(value)
|
115
|
+
case
|
116
|
+
when ([:CONTENT,:STRING_LITERAL].include?(value[0]) && value[0] == @stack.last[0])
|
117
|
+
@stack.last[1][0] << value[1]
|
118
|
+
@stack.last[1][1] = line_number_at(@src.pos)
|
119
|
+
when value[0] == :ERROR
|
120
|
+
@stack.push(value) if @options[:include].include?(:errors)
|
121
|
+
leave_object
|
122
|
+
when value[0] == :META_COMMENT
|
123
|
+
if @options[:include].include?(:meta_comments)
|
124
|
+
value[1] = [value[1], line_number_at(@src.pos)]
|
125
|
+
@stack.push(value)
|
126
|
+
end
|
127
|
+
else
|
128
|
+
value[1] = [value[1], line_number_at(@src.pos)]
|
129
|
+
@stack.push(value)
|
130
|
+
end
|
131
|
+
return self
|
132
|
+
end
|
133
|
+
|
134
|
+
# Start the lexical analysis.
|
135
|
+
def analyse(src=nil)
|
136
|
+
raise(ArgumentError, 'Lexer: failed to start analysis: no source given!') if src.nil? && @src.nil?
|
137
|
+
Log.debug('Lexer: starting lexical analysis...')
|
138
|
+
|
139
|
+
self.src = src || @src.string
|
140
|
+
self.src.reset
|
141
|
+
|
142
|
+
until self.src.eos?
|
143
|
+
case
|
144
|
+
when self.bibtex_mode?
|
145
|
+
parse_bibtex
|
146
|
+
when self.meta_mode?
|
147
|
+
parse_meta
|
148
|
+
when self.content_mode?
|
149
|
+
parse_content
|
150
|
+
when self.literal_mode?
|
151
|
+
parse_literal
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
Log.debug('Lexer: finished lexical analysis.')
|
156
|
+
push [false, '$end']
|
157
|
+
end
|
158
|
+
|
159
|
+
def parse_bibtex
|
160
|
+
case
|
161
|
+
when self.src.scan(/[\t\r\n\s]+/o)
|
162
|
+
when self.src.scan(/\{/o)
|
163
|
+
@brace_level += 1
|
164
|
+
push [:LBRACE,'{']
|
165
|
+
if (@brace_level == 1 && is_active?(:comment)) || (@brace_level == 2 && is_active?(:entry))
|
166
|
+
self.mode = :content
|
167
|
+
end
|
168
|
+
when self.src.scan(/\}/o)
|
169
|
+
return error_unbalanced_braces if @brace_level < 1
|
170
|
+
@brace_level -= 1
|
171
|
+
push [:RBRACE,'}']
|
172
|
+
leave_object if @brace_level == 0
|
173
|
+
when self.src.scan( /=/o)
|
174
|
+
push [:EQ,'=']
|
175
|
+
when self.src.scan(/,/o)
|
176
|
+
push [:COMMA,',']
|
177
|
+
when self.src.scan(/#/o)
|
178
|
+
push [:SHARP,'#']
|
179
|
+
when self.src.scan(/\d+/o)
|
180
|
+
push [:NUMBER,self.src.matched]
|
181
|
+
when self.src.scan(/[a-z\d:_!$\.%&*-]+/io)
|
182
|
+
push [:NAME,self.src.matched]
|
183
|
+
when self.src.scan(/"/o)
|
184
|
+
self.mode = :literal
|
185
|
+
when self.src.scan(/@/o)
|
186
|
+
error_unexpected_token
|
187
|
+
enter_object
|
188
|
+
when self.src.scan(/./o)
|
189
|
+
error_unexpected_token
|
190
|
+
enter_object
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def parse_meta
|
195
|
+
match = self.src.scan_until(@options[:strict] ? /@[\t ]*/o : /(^|\n)[\t ]*@[\t ]*/o)
|
196
|
+
unless self.src.matched.nil?
|
197
|
+
push [:META_COMMENT, match.chop]
|
198
|
+
enter_object
|
199
|
+
else
|
200
|
+
push [:META_COMMENT,self.src.rest]
|
201
|
+
self.src.terminate
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def parse_content
|
206
|
+
match = self.src.scan_until(/\{|\}/o)
|
207
|
+
case self.src.matched
|
208
|
+
when '{'
|
209
|
+
@brace_level += 1
|
210
|
+
push [:CONTENT,match]
|
211
|
+
when '}'
|
212
|
+
@brace_level -= 1
|
213
|
+
case
|
214
|
+
when @brace_level < 0
|
215
|
+
push [:CONTENT,match.chop]
|
216
|
+
error_unbalanced_braces
|
217
|
+
when @brace_level == 0
|
218
|
+
push [:CONTENT,match.chop]
|
219
|
+
push [:RBRACE,'}']
|
220
|
+
leave_object
|
221
|
+
when @brace_level == 1 && is_active?(:entry)
|
222
|
+
push [:CONTENT,match.chop]
|
223
|
+
push [:RBRACE,'}']
|
224
|
+
self.mode = :bibtex
|
225
|
+
else
|
226
|
+
push [:CONTENT, match]
|
227
|
+
end
|
228
|
+
else
|
229
|
+
push [:CONTENT,self.src.rest]
|
230
|
+
self.src.terminate
|
231
|
+
error_unterminated_content
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
def parse_literal
|
236
|
+
match = self.src.scan_until(/[\{\}"\n]/o)
|
237
|
+
case self.src.matched
|
238
|
+
when '{'
|
239
|
+
@brace_level += 1
|
240
|
+
push [:STRING_LITERAL,match]
|
241
|
+
when '}'
|
242
|
+
@brace_level -= 1
|
243
|
+
if @brace_level < 1
|
244
|
+
push [:STRING_LITERAL,match.chop]
|
245
|
+
error_unbalanced_braces
|
246
|
+
else
|
247
|
+
push [:STRING_LITERAL,match]
|
248
|
+
end
|
249
|
+
when '"'
|
250
|
+
if @brace_level == 1
|
251
|
+
push [:STRING_LITERAL,match.chop]
|
252
|
+
self.mode = :bibtex
|
253
|
+
else
|
254
|
+
push [:STRING_LITERAL,match]
|
255
|
+
end
|
256
|
+
when "\n"
|
257
|
+
push [:STRING_LITERAL,match.chop]
|
258
|
+
error_unterminated_string
|
259
|
+
else
|
260
|
+
push [:STRING_LITERAL,self.src.rest]
|
261
|
+
self.src.terminate
|
262
|
+
error_unterminated_string
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
# Called when the lexer encounters a new BibTeX object.
|
267
|
+
def enter_object
|
268
|
+
@brace_level = 0
|
269
|
+
self.mode = :bibtex
|
270
|
+
push [:AT,'@']
|
271
|
+
|
272
|
+
case
|
273
|
+
when self.src.scan(/string/io)
|
274
|
+
self.mode = :string
|
275
|
+
push [:STRING, self.src.matched]
|
276
|
+
when self.src.scan(/preamble/io)
|
277
|
+
self.mode = :preamble
|
278
|
+
push [:PREAMBLE, self.src.matched]
|
279
|
+
when self.src.scan(/comment/io)
|
280
|
+
self.mode = :comment
|
281
|
+
push [:COMMENT, self.src.matched]
|
282
|
+
when self.src.scan(/[a-z\d:_!\.$%&*-]+/io)
|
283
|
+
self.mode = :entry
|
284
|
+
push [:NAME, self.src.matched]
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
# Called when parser leaves a BibTeX object.
|
289
|
+
def leave_object
|
290
|
+
self.mode = :meta
|
291
|
+
@brace_level = 0
|
292
|
+
end
|
293
|
+
|
294
|
+
|
295
|
+
def error_unbalanced_braces
|
296
|
+
n = line_number_at(self.src.pos)
|
297
|
+
Log.warn("Lexer: unbalanced braces on line #{n}; brace level #{@brace_level}; mode #{@mode.inspect}.")
|
298
|
+
backtrace [:E_UNBALANCED_BRACES, [self.src.matched,n]]
|
299
|
+
end
|
300
|
+
|
301
|
+
def error_unterminated_string
|
302
|
+
n = line_number_at(self.src.pos)
|
303
|
+
Log.warn("Lexer: unterminated string on line #{n}; brace level #{@brace_level}; mode #{@mode.inspect}.")
|
304
|
+
backtrace [:E_UNTERMINATED_STRING, [self.src.matched,n]]
|
305
|
+
end
|
306
|
+
|
307
|
+
def error_unterminated_content
|
308
|
+
n = line_number_at(self.src.pos)
|
309
|
+
Log.warn("Lexer: unterminated content on line #{n}; brace level #{@brace_level}; mode #{@mode.inspect}.")
|
310
|
+
backtrace [:E_UNTERMINATED_CONTENT, [self.src.matched,n]]
|
311
|
+
end
|
312
|
+
|
313
|
+
def error_unexpected_token
|
314
|
+
n = line_number_at(self.src.pos)
|
315
|
+
Log.warn("Lexer: unexpected token `#{self.src.matched}' on line #{n}; brace level #{@brace_level}; mode #{@mode.inspect}.")
|
316
|
+
backtrace [:E_UNEXPECTED_TOKEN, [self.src.matched,n]]
|
317
|
+
end
|
318
|
+
|
319
|
+
def backtrace(error)
|
320
|
+
trace = []
|
321
|
+
trace.unshift(@stack.pop) until @stack.empty? || (!trace.empty? && [:AT,:META_COMMENT].include?(trace[0][0]))
|
322
|
+
trace << error
|
323
|
+
push [:ERROR,trace]
|
324
|
+
end
|
325
|
+
|
326
|
+
end
|
327
|
+
|
328
|
+
end
|
@@ -0,0 +1,578 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
-------- Grammar --------
|
4
|
+
|
5
|
+
rule 1 bibliography:
|
6
|
+
rule 2 bibliography: objects
|
7
|
+
rule 3 objects: object
|
8
|
+
rule 4 objects: objects object
|
9
|
+
rule 5 object: AT at_object
|
10
|
+
rule 6 object: META_COMMENT
|
11
|
+
rule 7 object: ERROR
|
12
|
+
rule 8 at_object: comment
|
13
|
+
rule 9 at_object: string
|
14
|
+
rule 10 at_object: preamble
|
15
|
+
rule 11 at_object: entry
|
16
|
+
rule 12 comment: COMMENT LBRACE content RBRACE
|
17
|
+
rule 13 content:
|
18
|
+
rule 14 content: CONTENT
|
19
|
+
rule 15 preamble: PREAMBLE LBRACE string_value RBRACE
|
20
|
+
rule 16 string: STRING LBRACE string_assignment RBRACE
|
21
|
+
rule 17 string_assignment: NAME EQ string_value
|
22
|
+
rule 18 string_value: string_literal
|
23
|
+
rule 19 string_value: string_value SHARP string_literal
|
24
|
+
rule 20 string_literal: NAME
|
25
|
+
rule 21 string_literal: STRING_LITERAL
|
26
|
+
rule 22 entry: entry_head assignments RBRACE
|
27
|
+
rule 23 entry: entry_head assignments COMMA RBRACE
|
28
|
+
rule 24 entry: entry_head RBRACE
|
29
|
+
rule 25 entry_head: NAME LBRACE key COMMA
|
30
|
+
rule 26 key: NAME
|
31
|
+
rule 27 key: NUMBER
|
32
|
+
rule 28 assignments: assignment
|
33
|
+
rule 29 assignments: assignments COMMA assignment
|
34
|
+
rule 30 assignment: NAME EQ value
|
35
|
+
rule 31 value: string_value
|
36
|
+
rule 32 value: NUMBER
|
37
|
+
rule 33 value: LBRACE content RBRACE
|
38
|
+
|
39
|
+
------- Symbols -------
|
40
|
+
|
41
|
+
**Nonterminals, with rules where they appear
|
42
|
+
|
43
|
+
$start (17)
|
44
|
+
on right:
|
45
|
+
on left :
|
46
|
+
bibliography (18)
|
47
|
+
on right:
|
48
|
+
on left : 1 2
|
49
|
+
objects (19)
|
50
|
+
on right: 2 4
|
51
|
+
on left : 3 4
|
52
|
+
object (20)
|
53
|
+
on right: 3 4
|
54
|
+
on left : 5 6 7
|
55
|
+
at_object (21)
|
56
|
+
on right: 5
|
57
|
+
on left : 8 9 10 11
|
58
|
+
comment (22)
|
59
|
+
on right: 8
|
60
|
+
on left : 12
|
61
|
+
string (23)
|
62
|
+
on right: 9
|
63
|
+
on left : 16
|
64
|
+
preamble (24)
|
65
|
+
on right: 10
|
66
|
+
on left : 15
|
67
|
+
entry (25)
|
68
|
+
on right: 11
|
69
|
+
on left : 22 23 24
|
70
|
+
content (26)
|
71
|
+
on right: 12 33
|
72
|
+
on left : 13 14
|
73
|
+
string_value (27)
|
74
|
+
on right: 15 17 19 31
|
75
|
+
on left : 18 19
|
76
|
+
string_assignment (28)
|
77
|
+
on right: 16
|
78
|
+
on left : 17
|
79
|
+
string_literal (29)
|
80
|
+
on right: 18 19
|
81
|
+
on left : 20 21
|
82
|
+
entry_head (30)
|
83
|
+
on right: 22 23 24
|
84
|
+
on left : 25
|
85
|
+
assignments (31)
|
86
|
+
on right: 22 23 29
|
87
|
+
on left : 28 29
|
88
|
+
key (32)
|
89
|
+
on right: 25
|
90
|
+
on left : 26 27
|
91
|
+
assignment (33)
|
92
|
+
on right: 28 29
|
93
|
+
on left : 30
|
94
|
+
value (34)
|
95
|
+
on right: 30
|
96
|
+
on left : 31 32 33
|
97
|
+
|
98
|
+
**Terminals, with rules where they appear
|
99
|
+
|
100
|
+
$end (0)
|
101
|
+
error (1)
|
102
|
+
AT (2) 5
|
103
|
+
COMMA (3) 23 25 29
|
104
|
+
COMMENT (4) 12
|
105
|
+
CONTENT (5) 14
|
106
|
+
ERROR (6) 7
|
107
|
+
EQ (7) 17 30
|
108
|
+
LBRACE (8) 12 15 16 25 33
|
109
|
+
META_COMMENT (9) 6
|
110
|
+
NAME (10) 17 20 25 26 30
|
111
|
+
NUMBER (11) 27 32
|
112
|
+
PREAMBLE (12) 15
|
113
|
+
RBRACE (13) 12 15 16 22 23 24 33
|
114
|
+
SHARP (14) 19
|
115
|
+
STRING (15) 16
|
116
|
+
STRING_LITERAL (16) 21
|
117
|
+
|
118
|
+
--------- State ---------
|
119
|
+
|
120
|
+
state 0
|
121
|
+
|
122
|
+
|
123
|
+
AT shift, and go to state 4
|
124
|
+
ERROR shift, and go to state 6
|
125
|
+
META_COMMENT shift, and go to state 5
|
126
|
+
$default reduce using rule 1 (bibliography)
|
127
|
+
|
128
|
+
bibliography go to state 1
|
129
|
+
objects go to state 2
|
130
|
+
object go to state 3
|
131
|
+
|
132
|
+
state 1
|
133
|
+
|
134
|
+
|
135
|
+
$end shift, and go to state 7
|
136
|
+
|
137
|
+
|
138
|
+
state 2
|
139
|
+
|
140
|
+
2) bibliography : objects _
|
141
|
+
4) objects : objects _ object
|
142
|
+
|
143
|
+
AT shift, and go to state 4
|
144
|
+
ERROR shift, and go to state 6
|
145
|
+
META_COMMENT shift, and go to state 5
|
146
|
+
$default reduce using rule 2 (bibliography)
|
147
|
+
|
148
|
+
object go to state 8
|
149
|
+
|
150
|
+
state 3
|
151
|
+
|
152
|
+
3) objects : object _
|
153
|
+
|
154
|
+
$default reduce using rule 3 (objects)
|
155
|
+
|
156
|
+
|
157
|
+
state 4
|
158
|
+
|
159
|
+
5) object : AT _ at_object
|
160
|
+
|
161
|
+
COMMENT shift, and go to state 14
|
162
|
+
NAME shift, and go to state 18
|
163
|
+
PREAMBLE shift, and go to state 15
|
164
|
+
STRING shift, and go to state 16
|
165
|
+
|
166
|
+
at_object go to state 9
|
167
|
+
comment go to state 10
|
168
|
+
string go to state 11
|
169
|
+
preamble go to state 12
|
170
|
+
entry go to state 13
|
171
|
+
entry_head go to state 17
|
172
|
+
|
173
|
+
state 5
|
174
|
+
|
175
|
+
6) object : META_COMMENT _
|
176
|
+
|
177
|
+
$default reduce using rule 6 (object)
|
178
|
+
|
179
|
+
|
180
|
+
state 6
|
181
|
+
|
182
|
+
7) object : ERROR _
|
183
|
+
|
184
|
+
$default reduce using rule 7 (object)
|
185
|
+
|
186
|
+
|
187
|
+
state 7
|
188
|
+
|
189
|
+
|
190
|
+
$end shift, and go to state 19
|
191
|
+
|
192
|
+
|
193
|
+
state 8
|
194
|
+
|
195
|
+
4) objects : objects object _
|
196
|
+
|
197
|
+
$default reduce using rule 4 (objects)
|
198
|
+
|
199
|
+
|
200
|
+
state 9
|
201
|
+
|
202
|
+
5) object : AT at_object _
|
203
|
+
|
204
|
+
$default reduce using rule 5 (object)
|
205
|
+
|
206
|
+
|
207
|
+
state 10
|
208
|
+
|
209
|
+
8) at_object : comment _
|
210
|
+
|
211
|
+
$default reduce using rule 8 (at_object)
|
212
|
+
|
213
|
+
|
214
|
+
state 11
|
215
|
+
|
216
|
+
9) at_object : string _
|
217
|
+
|
218
|
+
$default reduce using rule 9 (at_object)
|
219
|
+
|
220
|
+
|
221
|
+
state 12
|
222
|
+
|
223
|
+
10) at_object : preamble _
|
224
|
+
|
225
|
+
$default reduce using rule 10 (at_object)
|
226
|
+
|
227
|
+
|
228
|
+
state 13
|
229
|
+
|
230
|
+
11) at_object : entry _
|
231
|
+
|
232
|
+
$default reduce using rule 11 (at_object)
|
233
|
+
|
234
|
+
|
235
|
+
state 14
|
236
|
+
|
237
|
+
12) comment : COMMENT _ LBRACE content RBRACE
|
238
|
+
|
239
|
+
LBRACE shift, and go to state 20
|
240
|
+
|
241
|
+
|
242
|
+
state 15
|
243
|
+
|
244
|
+
15) preamble : PREAMBLE _ LBRACE string_value RBRACE
|
245
|
+
|
246
|
+
LBRACE shift, and go to state 21
|
247
|
+
|
248
|
+
|
249
|
+
state 16
|
250
|
+
|
251
|
+
16) string : STRING _ LBRACE string_assignment RBRACE
|
252
|
+
|
253
|
+
LBRACE shift, and go to state 22
|
254
|
+
|
255
|
+
|
256
|
+
state 17
|
257
|
+
|
258
|
+
22) entry : entry_head _ assignments RBRACE
|
259
|
+
23) entry : entry_head _ assignments COMMA RBRACE
|
260
|
+
24) entry : entry_head _ RBRACE
|
261
|
+
|
262
|
+
NAME shift, and go to state 26
|
263
|
+
RBRACE shift, and go to state 24
|
264
|
+
|
265
|
+
assignments go to state 23
|
266
|
+
assignment go to state 25
|
267
|
+
|
268
|
+
state 18
|
269
|
+
|
270
|
+
25) entry_head : NAME _ LBRACE key COMMA
|
271
|
+
|
272
|
+
LBRACE shift, and go to state 27
|
273
|
+
|
274
|
+
|
275
|
+
state 19
|
276
|
+
|
277
|
+
|
278
|
+
$default accept
|
279
|
+
|
280
|
+
|
281
|
+
state 20
|
282
|
+
|
283
|
+
12) comment : COMMENT LBRACE _ content RBRACE
|
284
|
+
|
285
|
+
CONTENT shift, and go to state 29
|
286
|
+
$default reduce using rule 13 (content)
|
287
|
+
|
288
|
+
content go to state 28
|
289
|
+
|
290
|
+
state 21
|
291
|
+
|
292
|
+
15) preamble : PREAMBLE LBRACE _ string_value RBRACE
|
293
|
+
|
294
|
+
NAME shift, and go to state 32
|
295
|
+
STRING_LITERAL shift, and go to state 33
|
296
|
+
|
297
|
+
string_value go to state 30
|
298
|
+
string_literal go to state 31
|
299
|
+
|
300
|
+
state 22
|
301
|
+
|
302
|
+
16) string : STRING LBRACE _ string_assignment RBRACE
|
303
|
+
|
304
|
+
NAME shift, and go to state 35
|
305
|
+
|
306
|
+
string_assignment go to state 34
|
307
|
+
|
308
|
+
state 23
|
309
|
+
|
310
|
+
22) entry : entry_head assignments _ RBRACE
|
311
|
+
23) entry : entry_head assignments _ COMMA RBRACE
|
312
|
+
29) assignments : assignments _ COMMA assignment
|
313
|
+
|
314
|
+
COMMA shift, and go to state 37
|
315
|
+
RBRACE shift, and go to state 36
|
316
|
+
|
317
|
+
|
318
|
+
state 24
|
319
|
+
|
320
|
+
24) entry : entry_head RBRACE _
|
321
|
+
|
322
|
+
$default reduce using rule 24 (entry)
|
323
|
+
|
324
|
+
|
325
|
+
state 25
|
326
|
+
|
327
|
+
28) assignments : assignment _
|
328
|
+
|
329
|
+
$default reduce using rule 28 (assignments)
|
330
|
+
|
331
|
+
|
332
|
+
state 26
|
333
|
+
|
334
|
+
30) assignment : NAME _ EQ value
|
335
|
+
|
336
|
+
EQ shift, and go to state 38
|
337
|
+
|
338
|
+
|
339
|
+
state 27
|
340
|
+
|
341
|
+
25) entry_head : NAME LBRACE _ key COMMA
|
342
|
+
|
343
|
+
NAME shift, and go to state 40
|
344
|
+
NUMBER shift, and go to state 41
|
345
|
+
|
346
|
+
key go to state 39
|
347
|
+
|
348
|
+
state 28
|
349
|
+
|
350
|
+
12) comment : COMMENT LBRACE content _ RBRACE
|
351
|
+
|
352
|
+
RBRACE shift, and go to state 42
|
353
|
+
|
354
|
+
|
355
|
+
state 29
|
356
|
+
|
357
|
+
14) content : CONTENT _
|
358
|
+
|
359
|
+
$default reduce using rule 14 (content)
|
360
|
+
|
361
|
+
|
362
|
+
state 30
|
363
|
+
|
364
|
+
15) preamble : PREAMBLE LBRACE string_value _ RBRACE
|
365
|
+
19) string_value : string_value _ SHARP string_literal
|
366
|
+
|
367
|
+
RBRACE shift, and go to state 43
|
368
|
+
SHARP shift, and go to state 44
|
369
|
+
|
370
|
+
|
371
|
+
state 31
|
372
|
+
|
373
|
+
18) string_value : string_literal _
|
374
|
+
|
375
|
+
$default reduce using rule 18 (string_value)
|
376
|
+
|
377
|
+
|
378
|
+
state 32
|
379
|
+
|
380
|
+
20) string_literal : NAME _
|
381
|
+
|
382
|
+
$default reduce using rule 20 (string_literal)
|
383
|
+
|
384
|
+
|
385
|
+
state 33
|
386
|
+
|
387
|
+
21) string_literal : STRING_LITERAL _
|
388
|
+
|
389
|
+
$default reduce using rule 21 (string_literal)
|
390
|
+
|
391
|
+
|
392
|
+
state 34
|
393
|
+
|
394
|
+
16) string : STRING LBRACE string_assignment _ RBRACE
|
395
|
+
|
396
|
+
RBRACE shift, and go to state 45
|
397
|
+
|
398
|
+
|
399
|
+
state 35
|
400
|
+
|
401
|
+
17) string_assignment : NAME _ EQ string_value
|
402
|
+
|
403
|
+
EQ shift, and go to state 46
|
404
|
+
|
405
|
+
|
406
|
+
state 36
|
407
|
+
|
408
|
+
22) entry : entry_head assignments RBRACE _
|
409
|
+
|
410
|
+
$default reduce using rule 22 (entry)
|
411
|
+
|
412
|
+
|
413
|
+
state 37
|
414
|
+
|
415
|
+
23) entry : entry_head assignments COMMA _ RBRACE
|
416
|
+
29) assignments : assignments COMMA _ assignment
|
417
|
+
|
418
|
+
NAME shift, and go to state 26
|
419
|
+
RBRACE shift, and go to state 47
|
420
|
+
|
421
|
+
assignment go to state 48
|
422
|
+
|
423
|
+
state 38
|
424
|
+
|
425
|
+
30) assignment : NAME EQ _ value
|
426
|
+
|
427
|
+
LBRACE shift, and go to state 52
|
428
|
+
NAME shift, and go to state 32
|
429
|
+
NUMBER shift, and go to state 51
|
430
|
+
STRING_LITERAL shift, and go to state 33
|
431
|
+
|
432
|
+
string_literal go to state 31
|
433
|
+
string_value go to state 49
|
434
|
+
value go to state 50
|
435
|
+
|
436
|
+
state 39
|
437
|
+
|
438
|
+
25) entry_head : NAME LBRACE key _ COMMA
|
439
|
+
|
440
|
+
COMMA shift, and go to state 53
|
441
|
+
|
442
|
+
|
443
|
+
state 40
|
444
|
+
|
445
|
+
26) key : NAME _
|
446
|
+
|
447
|
+
$default reduce using rule 26 (key)
|
448
|
+
|
449
|
+
|
450
|
+
state 41
|
451
|
+
|
452
|
+
27) key : NUMBER _
|
453
|
+
|
454
|
+
$default reduce using rule 27 (key)
|
455
|
+
|
456
|
+
|
457
|
+
state 42
|
458
|
+
|
459
|
+
12) comment : COMMENT LBRACE content RBRACE _
|
460
|
+
|
461
|
+
$default reduce using rule 12 (comment)
|
462
|
+
|
463
|
+
|
464
|
+
state 43
|
465
|
+
|
466
|
+
15) preamble : PREAMBLE LBRACE string_value RBRACE _
|
467
|
+
|
468
|
+
$default reduce using rule 15 (preamble)
|
469
|
+
|
470
|
+
|
471
|
+
state 44
|
472
|
+
|
473
|
+
19) string_value : string_value SHARP _ string_literal
|
474
|
+
|
475
|
+
NAME shift, and go to state 32
|
476
|
+
STRING_LITERAL shift, and go to state 33
|
477
|
+
|
478
|
+
string_literal go to state 54
|
479
|
+
|
480
|
+
state 45
|
481
|
+
|
482
|
+
16) string : STRING LBRACE string_assignment RBRACE _
|
483
|
+
|
484
|
+
$default reduce using rule 16 (string)
|
485
|
+
|
486
|
+
|
487
|
+
state 46
|
488
|
+
|
489
|
+
17) string_assignment : NAME EQ _ string_value
|
490
|
+
|
491
|
+
NAME shift, and go to state 32
|
492
|
+
STRING_LITERAL shift, and go to state 33
|
493
|
+
|
494
|
+
string_value go to state 55
|
495
|
+
string_literal go to state 31
|
496
|
+
|
497
|
+
state 47
|
498
|
+
|
499
|
+
23) entry : entry_head assignments COMMA RBRACE _
|
500
|
+
|
501
|
+
$default reduce using rule 23 (entry)
|
502
|
+
|
503
|
+
|
504
|
+
state 48
|
505
|
+
|
506
|
+
29) assignments : assignments COMMA assignment _
|
507
|
+
|
508
|
+
$default reduce using rule 29 (assignments)
|
509
|
+
|
510
|
+
|
511
|
+
state 49
|
512
|
+
|
513
|
+
19) string_value : string_value _ SHARP string_literal
|
514
|
+
31) value : string_value _
|
515
|
+
|
516
|
+
SHARP shift, and go to state 44
|
517
|
+
$default reduce using rule 31 (value)
|
518
|
+
|
519
|
+
|
520
|
+
state 50
|
521
|
+
|
522
|
+
30) assignment : NAME EQ value _
|
523
|
+
|
524
|
+
$default reduce using rule 30 (assignment)
|
525
|
+
|
526
|
+
|
527
|
+
state 51
|
528
|
+
|
529
|
+
32) value : NUMBER _
|
530
|
+
|
531
|
+
$default reduce using rule 32 (value)
|
532
|
+
|
533
|
+
|
534
|
+
state 52
|
535
|
+
|
536
|
+
33) value : LBRACE _ content RBRACE
|
537
|
+
|
538
|
+
CONTENT shift, and go to state 29
|
539
|
+
$default reduce using rule 13 (content)
|
540
|
+
|
541
|
+
content go to state 56
|
542
|
+
|
543
|
+
state 53
|
544
|
+
|
545
|
+
25) entry_head : NAME LBRACE key COMMA _
|
546
|
+
|
547
|
+
$default reduce using rule 25 (entry_head)
|
548
|
+
|
549
|
+
|
550
|
+
state 54
|
551
|
+
|
552
|
+
19) string_value : string_value SHARP string_literal _
|
553
|
+
|
554
|
+
$default reduce using rule 19 (string_value)
|
555
|
+
|
556
|
+
|
557
|
+
state 55
|
558
|
+
|
559
|
+
17) string_assignment : NAME EQ string_value _
|
560
|
+
19) string_value : string_value _ SHARP string_literal
|
561
|
+
|
562
|
+
SHARP shift, and go to state 44
|
563
|
+
$default reduce using rule 17 (string_assignment)
|
564
|
+
|
565
|
+
|
566
|
+
state 56
|
567
|
+
|
568
|
+
33) value : LBRACE content _ RBRACE
|
569
|
+
|
570
|
+
RBRACE shift, and go to state 57
|
571
|
+
|
572
|
+
|
573
|
+
state 57
|
574
|
+
|
575
|
+
33) value : LBRACE content RBRACE _
|
576
|
+
|
577
|
+
$default reduce using rule 33 (value)
|
578
|
+
|