Class: RDoc::Markdown::Literals
Relationships & Source Files | |
Namespace Children | |
Classes:
| |
Exceptions:
| |
Inherits: | Object |
Defined in: | lib/rdoc/markdown/literals.rb |
Constant Summary
Class Method Summary
-
.new(str, debug = false) ⇒ Literals
constructor
Internal use only
This is distinct from setup_parser so that a standalone parser can redefine #initialize and still have access to the proper parser setup code.
- .rule_info(name, rendered) Internal use only
Instance Attribute Summary
- #failed_rule readonly Internal use only
- #failing_rule_offset readonly Internal use only
- #pos rw Internal use only
- #result rw Internal use only
- #string readonly Internal use only
Instance Method Summary
-
#_Alphanumeric
Alphanumeric = /p
Word
/. -
#_AlphanumericAscii
AlphanumericAscii = /[A-Za-z0-9]/.
-
#_BOM
BOM = “uFEFF”.
-
#_Newline
Newline = /n|rn?|p
Zl
|pZp
/. -
#_NonAlphanumeric
NonAlphanumeric = /p
^Word
/. -
#_Spacechar
Spacechar = /t|p
Zs
/. - #setup_foreign_grammar
- #apply(rule) Internal use only
- #apply_with_args(rule, *args) Internal use only
- #current_column(target = pos) Internal use only
- #current_line(target = pos) Internal use only
- #external_invoke(other, rule, *args) Internal use only
- #failure_caret Internal use only
- #failure_character Internal use only
- #failure_info Internal use only
- #failure_oneline Internal use only
-
#get_byte
Internal use only
See additional method definition at line 187.
- #get_text(start) Internal use only
- #grow_lr(rule, args, start_pos, m) Internal use only
- #lines Internal use only
- #match_string(str) Internal use only
- #parse(rule = nil) Internal use only
- #raise_error Internal use only
- #scan(reg) Internal use only
- #set_failed_rule(name) Internal use only
-
#set_string(string, pos)
Internal use only
Sets the string and current parsing position for the parser.
-
#setup_parser(str, debug = false)
Internal use only
Prepares for parsing
str
. - #show_error(io = STDOUT) Internal use only
- #show_pos Internal use only
Constructor Details
.new(str, debug = false) ⇒ Literals
This is distinct from setup_parser so that a standalone parser can redefine RDoc::Markdown#initialize and still have access to the proper parser setup code.
# File 'lib/rdoc/markdown/literals.rb', line 18
def initialize(str, debug=false) setup_parser(str, debug) end
Class Method Details
.rule_info(name, rendered)
Instance Attribute Details
#failed_rule (readonly)
# File 'lib/rdoc/markdown/literals.rb', line 164
attr_reader :failed_rule
#failing_rule_offset (readonly)
# File 'lib/rdoc/markdown/literals.rb', line 37
attr_reader :failing_rule_offset
#pos (rw)
# File 'lib/rdoc/markdown/literals.rb', line 38
attr_accessor :result, :pos
#result (rw)
# File 'lib/rdoc/markdown/literals.rb', line 38
attr_accessor :result, :pos
#string (readonly)
# File 'lib/rdoc/markdown/literals.rb', line 36
attr_reader :string
Instance Method Details
#_Alphanumeric
Alphanumeric = /pWord
/
# File 'lib/rdoc/markdown/literals.rb', line 368
def _Alphanumeric _tmp = scan(/\A(?-mix:\p{Word})/) set_failed_rule :_Alphanumeric unless _tmp return _tmp end
#_AlphanumericAscii
AlphanumericAscii = /[A-Za-z0-9]/
# File 'lib/rdoc/markdown/literals.rb', line 375
def _AlphanumericAscii _tmp = scan(/\A(?-mix:[A-Za-z0-9])/) set_failed_rule :_AlphanumericAscii unless _tmp return _tmp end
#_BOM
BOM = “uFEFF”
# File 'lib/rdoc/markdown/literals.rb', line 382
def _BOM _tmp = match_string("uFEFF") set_failed_rule :_BOM unless _tmp return _tmp end
#_Newline
Newline = /n|rn?|pZl
|pZp
/
# File 'lib/rdoc/markdown/literals.rb', line 389
def _Newline _tmp = scan(/\A(?-mix:\n|\r\n?|\p{Zl}|\p{Zp})/) set_failed_rule :_Newline unless _tmp return _tmp end
#_NonAlphanumeric
NonAlphanumeric = /p^Word
/
# File 'lib/rdoc/markdown/literals.rb', line 396
def _NonAlphanumeric _tmp = scan(/\A(?-mix:\p{^Word})/) set_failed_rule :_NonAlphanumeric unless _tmp return _tmp end
#_Spacechar
Spacechar = /t|pZs
/
# File 'lib/rdoc/markdown/literals.rb', line 403
def _Spacechar _tmp = scan(/\A(?-mix:\t|\p{Zs})/) set_failed_rule :_Spacechar unless _tmp return _tmp end
#apply(rule)
# File 'lib/rdoc/markdown/literals.rb', line 295
def apply(rule) if m = @memoizations[rule][@pos] @pos = m.pos if !m.set m.left_rec = true return nil end @result = m.result return m.ans else m = MemoEntry.new(nil, @pos) @memoizations[rule][@pos] = m start_pos = @pos ans = __send__ rule lr = m.left_rec m.move! ans, @pos, @result # Don't bother trying to grow the left recursion # if it's failing straight away (thus there is no seed) if ans and lr return grow_lr(rule, nil, start_pos, m) else return ans end end end
#apply_with_args(rule, *args)
# File 'lib/rdoc/markdown/literals.rb', line 262
def apply_with_args(rule, *args) memo_key = [rule, args] if m = @memoizations[memo_key][@pos] @pos = m.pos if !m.set m.left_rec = true return nil end @result = m.result return m.ans else m = MemoEntry.new(nil, @pos) @memoizations[memo_key][@pos] = m start_pos = @pos ans = __send__ rule, *args lr = m.left_rec m.move! ans, @pos, @result # Don't bother trying to grow the left recursion # if it's failing straight away (thus there is no seed) if ans and lr return grow_lr(rule, args, start_pos, m) else return ans end end end
#current_column(target = pos)
#current_line(target = pos)
#external_invoke(other, rule, *args)
# File 'lib/rdoc/markdown/literals.rb', line 243
def external_invoke(other, rule, *args) old_pos = @pos old_string = @string set_string other.string, other.pos begin if val = __send__(rule, *args) other.pos = @pos other.result = @result else other.set_failed_rule "#{self.class}##{rule}" end val ensure set_string old_string, old_pos end end
#failure_caret
# File 'lib/rdoc/markdown/literals.rb', line 101
def failure_caret l = current_line @failing_rule_offset c = current_column @failing_rule_offset line = lines[l-1] "#{line}\n#{' ' * (c - 1)}^" end
#failure_character
# File 'lib/rdoc/markdown/literals.rb', line 109
def failure_character l = current_line @failing_rule_offset c = current_column @failing_rule_offset lines[l-1][c-1, 1] end
#failure_info
# File 'lib/rdoc/markdown/literals.rb', line 89
def failure_info l = current_line @failing_rule_offset c = current_column @failing_rule_offset if @failed_rule.kind_of? Symbol info = self.class::Rules[@failed_rule] "line #{l}, column #{c}: failed rule '#{info.name}' = '#{info.rendered}'" else "line #{l}, column #{c}: failed rule '#{@failed_rule}'" end end
#failure_oneline
# File 'lib/rdoc/markdown/literals.rb', line 115
def failure_oneline l = current_line @failing_rule_offset c = current_column @failing_rule_offset char = lines[l-1][c-1, 1] if @failed_rule.kind_of? Symbol info = self.class::Rules[@failed_rule] "@#{l}:#{c} failed rule '#{info.name}', got '#{char}'" else "@#{l}:#{c} failed rule '#{@failed_rule}', got '#{char}'" end end
#get_byte
See additional method definition at line 187.
# File 'lib/rdoc/markdown/literals.rb', line 197
def get_byte if @pos >= @string_size return nil end s = @string[@pos].ord @pos += 1 s end
#get_text(start)
# File 'lib/rdoc/markdown/literals.rb', line 69
def get_text(start) @string[start..@pos-1] end
#grow_lr(rule, args, start_pos, m)
# File 'lib/rdoc/markdown/literals.rb', line 327
def grow_lr(rule, args, start_pos, m) while true @pos = start_pos @result = m.result if args ans = __send__ rule, *args else ans = __send__ rule end return nil unless ans break if @pos <= m.pos m.move! ans, @pos, @result end @result = m.result @pos = m.pos return m.ans end
#lines
# File 'lib/rdoc/markdown/literals.rb', line 61
def lines lines = [] string.each_line { |l| lines << l } lines end
#match_string(str)
# File 'lib/rdoc/markdown/literals.rb', line 166
def match_string(str) len = str.size if @string[pos,len] == str @pos += len return str end return nil end
#parse(rule = nil)
# File 'lib/rdoc/markdown/literals.rb', line 208
def parse(rule=nil) # We invoke the rules indirectly via apply # instead of by just calling them as methods because # if the rules use left recursion, apply needs to # manage that. if !rule apply(:_root) else method = rule.gsub("-","_hyphen_") apply :"_#{method}" end end
#raise_error
# File 'lib/rdoc/markdown/literals.rb', line 132
def raise_error raise ParseError, failure_oneline end
#scan(reg)
# File 'lib/rdoc/markdown/literals.rb', line 176
def scan(reg) if m = reg.match(@string[@pos..-1]) width = m.end(0) @pos += width return true end return nil end
#set_failed_rule(name)
# File 'lib/rdoc/markdown/literals.rb', line 157
def set_failed_rule(name) if @pos > @failing_rule_offset @failed_rule = name @failing_rule_offset = @pos end end
#set_string(string, pos)
Sets the string and current parsing position for the parser.
#setup_foreign_grammar
[ GitHub ]# File 'lib/rdoc/markdown/literals.rb', line 365
def setup_foreign_grammar; end
#setup_parser(str, debug = false)
Prepares for parsing str
. If you define a custom initialize you must call this method before #parse
# File 'lib/rdoc/markdown/literals.rb', line 26
def setup_parser(str, debug=false) set_string str, 0 @memoizations = Hash.new { |h,k| h[k] = {} } @result = nil @failed_rule = nil @failing_rule_offset = -1 setup_foreign_grammar end
#show_error(io = STDOUT)
# File 'lib/rdoc/markdown/literals.rb', line 136
def show_error(io=STDOUT) error_pos = @failing_rule_offset line_no = current_line(error_pos) col_no = current_column(error_pos) io.puts "On line #{line_no}, column #{col_no}:" if @failed_rule.kind_of? Symbol info = self.class::Rules[@failed_rule] io.puts "Failed to match '#{info.rendered}' (rule '#{info.name}')" else io.puts "Failed to match rule '#{@failed_rule}'" end io.puts "Got: #{string[error_pos,1].inspect}" line = lines[line_no-1] io.puts "=> #{line}" io.print(" " * (col_no + 3)) io.puts "^" end
#show_pos
# File 'lib/rdoc/markdown/literals.rb', line 80
def show_pos width = 10 if @pos < width "#{@pos} (\"#{@string[0,@pos]}\" @ \"#{@string[@pos,width]}\")" else "#{@pos} (\"... #{@string[@pos - width, width]}\" @ \"#{@string[@pos,width]}\")" end end