6
left QUOTE BAR SLASH BACK_SLASH URL OTHER
7
REF_OPEN FOOTNOTE_OPEN FOOTNOTE_CLOSE
11
token EM_OPEN EM_CLOSE
15
INDEX_OPEN INDEX_CLOSE
17
FOOTNOTE_OPEN FOOTNOTE_CLOSE
19
BAR QUOTE SLASH BACK_SLASH URL OTHER EX_LOW EX_HIGH
24
elements : elements element { result.push(val[1]) }
25
| element { result = val }
38
emphasis : EM_OPEN content EM_CLOSE {
40
add_children_to_element(result, *val[1])
43
code : CODE_OPEN content CODE_CLOSE {
45
add_children_to_element(result, *val[1])
48
var : VAR_OPEN content VAR_CLOSE {
50
add_children_to_element(result, *val[1])
53
keyboard : KBD_OPEN content KBD_CLOSE {
55
add_children_to_element(result, *val[1])
58
index : INDEX_OPEN content INDEX_CLOSE {
60
add_children_to_element(result, *val[1])
65
# ((<subst|filename/element_label>))
67
reference : REF_OPEN substitute ref_label REF_CLOSE
68
{ result = Reference.new(val[2])
69
add_children_to_element(result, *val[1])
71
| REF_OPEN ref_label2 REF_CLOSE
73
result = make_reference_from_label(val[1])
77
ref_label : URL ref_url_strings { result = Reference::URL.new(val[1]) }
78
| filename element_label
79
{ result = Reference::TemporaryLabel.new(val[1],
82
{ result = Reference::TemporaryLabel.new(val[0]) }
83
| filename { result = Reference::TemporaryLabel.new([], val[0]) }
85
ref_label2 : URL ref_url_strings { result = Reference::URL.new(val[1]) }
86
| filename element_label2
87
{ result = Reference::TemporaryLabel.new(val[1],
90
{ result = Reference::TemporaryLabel.new(val[0]) }
91
| filename { result = Reference::TemporaryLabel.new([],
94
substitute : ref_subst_content BAR
95
| QUOTE ref_subst_content_q QUOTE BAR
97
| QUOTE ref_subst_strings_q QUOTE BAR
98
{ result = [StringElement.new(val[1])] }
101
filename : ref_subst_strings_first SLASH
102
| QUOTE ref_subst_strings_q QUOTE SLASH
106
# when substitute part exists
107
element_label : ref_subst_strings_first
108
{ result = [StringElement.new(val[0])] }
109
| QUOTE ref_subst_strings_q QUOTE
110
{ result = [StringElement.new(val[1])] }
112
# when substitute part doesn't exist
113
# in this case, element label can contain Inlines
114
element_label2 : ref_subst_content
115
| QUOTE ref_subst_content_q QUOTE
117
| QUOTE ref_subst_strings_q QUOTE
118
{ result = [StringElement.new(val[1])] }
121
ref_subst_content : ref_subst_ele2 ref_subst_eles
122
{ result = val[1].unshift(val[0]) }
123
| ref_subst_str_ele_first ref_subst_eles
124
{ result = val[1].unshift(val[0]) }
125
| ref_subst_str_ele_first
127
| ref_subst_ele2 { result = val }
129
ref_subst_content_q : ref_subst_eles_q
131
ref_subst_eles : ref_subst_eles ref_subst_ele
132
{ result.push(val[1]) }
133
| ref_subst_ele { result = val }
135
ref_subst_eles_q : ref_subst_eles_q ref_subst_ele_q
136
{ result.push(val[1]) }
137
| ref_subst_ele_q { result = val }
139
ref_subst_ele2 : emphasis
146
ref_subst_ele : ref_subst_ele2
149
ref_subst_ele_q : ref_subst_ele2
150
| ref_subst_str_ele_q
153
ref_subst_str_ele : ref_subst_strings = EX_LOW
154
{ result = StringElement.new(val[0]) }
156
ref_subst_str_ele_first : ref_subst_strings_first
157
{ result = StringElement.new(val[0]) }
159
ref_subst_str_ele_q : ref_subst_strings_q = EX_LOW
160
{ result = StringElement.new(val[0]) }
163
ref_subst_strings : ref_subst_strings ref_subst_string3
167
# if it is first element of substitute, it can't contain
169
ref_subst_strings_first : ref_subst_string ref_subst_strings = EX_HIGH
171
| ref_subst_string = EX_LOW
173
ref_subst_strings_q : ref_subst_strings_q ref_subst_string_q
178
ref_subst_string : OTHER
184
ref_subst_string2 : ref_subst_string
187
ref_subst_string3 : ref_subst_string2
190
ref_subst_string_q : ref_subst_string2
197
ref_url_strings : ref_url_strings ref_url_string { result << val[1] }
201
ref_url_string : OTHER
202
| BACK_SLASH BACK_SLASH
227
footnote : FOOTNOTE_OPEN content FOOTNOTE_CLOSE {
228
result = Footnote.new
229
add_children_to_element(result, *val[1])
232
verb : VERB_OPEN verb_strings VERB_CLOSE {
233
result = Verb.new(val[1]) }
238
# OTHER, QUOTE, BAR, SLASH, BACK_SLASH, URL
239
normal_string : OTHER
246
normal_strings : normal_strings normal_string
251
normal_str_ele : normal_strings = EX_LOW
252
{ result = StringElement.new(val[0]) }
256
verb_string : verb_normal_string
257
| BACK_SLASH verb_normal_string { result = val[1] }
258
| BACK_SLASH VERB_CLOSE { result = val[1] }
259
| BACK_SLASH BACK_SLASH { result = val[1] }
262
verb_normal_string : OTHER
284
verb_strings : verb_strings verb_string { result << val[1] }
287
/* verb_str_ele : verb_strings
292
include ParserUtility
296
EM_OPEN_RE = /\A#{Regexp.quote(EM_OPEN)}/
298
EM_CLOSE_RE = /\A#{Regexp.quote(EM_CLOSE)}/
300
CODE_OPEN_RE = /\A#{Regexp.quote(CODE_OPEN)}/
302
CODE_CLOSE_RE = /\A#{Regexp.quote(CODE_CLOSE)}/
304
VAR_OPEN_RE = /\A#{Regexp.quote(VAR_OPEN)}/
306
VAR_CLOSE_RE = /\A#{Regexp.quote(VAR_CLOSE)}/
308
KBD_OPEN_RE = /\A#{Regexp.quote(KBD_OPEN)}/
310
KBD_CLOSE_RE = /\A#{Regexp.quote(KBD_CLOSE)}/
312
INDEX_OPEN_RE = /\A#{Regexp.quote(INDEX_OPEN)}/
314
INDEX_CLOSE_RE = /\A#{Regexp.quote(INDEX_CLOSE)}/
316
REF_OPEN_RE = /\A#{Regexp.quote(REF_OPEN)}/
318
REF_CLOSE_RE = /\A#{Regexp.quote(REF_CLOSE)}/
319
FOOTNOTE_OPEN = '((-'
320
FOOTNOTE_OPEN_RE = /\A#{Regexp.quote(FOOTNOTE_OPEN)}/
321
FOOTNOTE_CLOSE = '-))'
322
FOOTNOTE_CLOSE_RE = /\A#{Regexp.quote(FOOTNOTE_CLOSE)}/
324
VERB_OPEN_RE = /\A#{Regexp.quote(VERB_OPEN)}/
326
VERB_CLOSE_RE = /\A#{Regexp.quote(VERB_CLOSE)}/
329
BAR_RE = /\A#{Regexp.quote(BAR)}/
331
QUOTE_RE = /\A#{Regexp.quote(QUOTE)}/
333
SLASH_RE = /\A#{Regexp.quote(SLASH)}/
335
BACK_SLASH_RE = /\A#{Regexp.quote(BACK_SLASH)}/
337
URL_RE = /\A#{Regexp.quote(URL)}/
339
# Workaround for Regexp option change of Ruby 1.5.x
340
other_re_mode = Regexp::EXTENDED
341
if RUBY_VERSION > "1.5"
342
other_re_mode |= Regexp::MULTILINE
344
other_re_mode |= Regexp::POSIXLINE
347
OTHER_RE = Regexp.new(
348
"\\A.+?(?=#{Regexp.quote(EM_OPEN)}|#{Regexp.quote(EM_CLOSE)}|
349
#{Regexp.quote(CODE_OPEN)}|#{Regexp.quote(CODE_CLOSE)}|
350
#{Regexp.quote(VAR_OPEN)}|#{Regexp.quote(VAR_CLOSE)}|
351
#{Regexp.quote(KBD_OPEN)}|#{Regexp.quote(KBD_CLOSE)}|
352
#{Regexp.quote(INDEX_OPEN)}|#{Regexp.quote(INDEX_CLOSE)}|
353
#{Regexp.quote(REF_OPEN)}|#{Regexp.quote(REF_CLOSE)}|
354
#{Regexp.quote(FOOTNOTE_OPEN)}|#{Regexp.quote(FOOTNOTE_CLOSE)}|
355
#{Regexp.quote(VERB_OPEN)}|#{Regexp.quote(VERB_CLOSE)}|
356
#{Regexp.quote(BAR)}|
357
#{Regexp.quote(QUOTE)}|
358
#{Regexp.quote(SLASH)}|
359
#{Regexp.quote(BACK_SLASH)}|
360
#{Regexp.quote(URL)})", other_re_mode)
366
def_delegator(:@blockp, :tree)
369
@src = StringScanner.new(src)
376
return [false, false] if @src.eos?
377
# p @src.rest if @yydebug
378
if ret = @src.scan(EM_OPEN_RE)
381
elsif ret = @src.scan(EM_CLOSE_RE)
384
elsif ret = @src.scan(CODE_OPEN_RE)
387
elsif ret = @src.scan(CODE_CLOSE_RE)
390
elsif ret = @src.scan(VAR_OPEN_RE)
393
elsif ret = @src.scan(VAR_CLOSE_RE)
396
elsif ret = @src.scan(KBD_OPEN_RE)
399
elsif ret = @src.scan(KBD_CLOSE_RE)
402
elsif ret = @src.scan(INDEX_OPEN_RE)
405
elsif ret = @src.scan(INDEX_CLOSE_RE)
408
elsif ret = @src.scan(REF_OPEN_RE)
411
elsif ret = @src.scan(REF_CLOSE_RE)
414
elsif ret = @src.scan(FOOTNOTE_OPEN_RE)
416
[:FOOTNOTE_OPEN, ret]
417
elsif ret = @src.scan(FOOTNOTE_CLOSE_RE)
419
[:FOOTNOTE_CLOSE, ret]
420
elsif ret = @src.scan(VERB_OPEN_RE)
423
elsif ret = @src.scan(VERB_CLOSE_RE)
426
elsif ret = @src.scan(BAR_RE)
429
elsif ret = @src.scan(QUOTE_RE)
432
elsif ret = @src.scan(SLASH_RE)
435
elsif ret = @src.scan(BACK_SLASH_RE)
438
elsif ret = @src.scan(URL_RE)
441
elsif ret = @src.scan(OTHER_RE)
452
def make_reference_from_label(label)
453
# Reference.new_from_label_under_document_struct(label, tree.document_struct)
454
Reference.new_from_label_without_document_struct(label)
457
def on_error(et, ev, values)
458
lines_of_rest = (RUBY_VERSION >= '1.9.0' ? @src.rest.lines.to_a.length : @src.rest.to_a.length )
459
prev_words = prev_words_on_error(ev)
460
at = 4 + prev_words.length
462
RD syntax error: line #{@blockp.line_index - lines_of_rest}:
463
...#{prev_words} #{(ev||'')} #{next_words_on_error()} ...
465
message << " " * at + "^" * (ev ? ev.length : 0) + "\n"
466
raise ParseError, message
469
def prev_words_on_error(ev)
471
if ev and /#{Regexp.quote(ev)}$/ =~ pre
478
if n = src.rindex("\n")
486
def next_words_on_error
487
if n = @src.rest.index("\n")
488
@src.rest[0 .. (n-1)]
496
require "rd/parser-util"
497
require "forwardable"
502
end # end of module RD