# File lib/racc/grammarfileparser.rb, line 297 297: def initialize(str, filename = '-') 298: @lines = str.split(/\n|\r\n|\r/) 299: @filename = filename 300: @lineno = 1 301: @line_head = true 302: @in_rule_blk = false 303: @in_conv_blk = false 304: @in_block = nil 305: @epilogue = '' 306: @debug = false 307: next_line 308: end
# File lib/racc/grammarfileparser.rb, line 312 312: def lineno 313: @lineno + 1 314: end
# File lib/racc/grammarfileparser.rb, line 318 318: def yylex(&block) 319: unless @debug 320: yylex0(&block) 321: else 322: yylex0 do |sym, tok| 323: $stderr.printf "%7d %-10s %s\n", lineno(), sym.inspect, tok.inspect 324: yield [sym, tok] 325: end 326: end 327: end
# File lib/racc/grammarfileparser.rb, line 398 398: def atom_symbol(token) 399: if token == 'end' 400: symbol = :END 401: @in_conv_blk = false 402: @in_rule_blk = false 403: else 404: if @line_head and not @in_conv_blk and not @in_rule_blk 405: symbol = ReservedWord[token] || :SYMBOL 406: else 407: symbol = :SYMBOL 408: end 409: case symbol 410: when :RULE then @in_rule_blk = true 411: when :CONV then @in_conv_blk = true 412: end 413: end 414: @line_head = false 415: symbol 416: end
# File lib/racc/grammarfileparser.rb, line 548 548: def get_quoted_re(left) 549: term = Regexp.quote(LEFT_TO_RIGHT[left] || left) 550: CACHE[left] ||= /\A[^#{term}\\]*(?:\\.[^\\#{term}]*)*#{term}/ 551: end
# File lib/racc/grammarfileparser.rb, line 504 504: def literal_head?(pre, post) 505: (!pre || /[a-zA-Z_0-9]/ !~ pre[1,1]) && 506: !post.empty? && /\A[\s\=]/ !~ post 507: end
# File lib/racc/grammarfileparser.rb, line 363 363: def next_line 364: @lineno += 1 365: @line = @lines[@lineno] 366: if not @line or /\A----/ =~ @line 367: @epilogue = @lines.join("\n") 368: @lines.clear 369: @line = nil 370: if @in_block 371: @lineno -= 1 372: scan_error! sprintf('unterminated %s', @in_block) 373: end 374: false 375: else 376: @line.sub!(/(?:\n|\r\n|\r)\z/, '') 377: @line_head = true 378: true 379: end 380: end
# File lib/racc/grammarfileparser.rb, line 509 509: def read(len) 510: s = @line[0, len] 511: @line = @line[len .. 1] 512: s 513: end
# File lib/racc/grammarfileparser.rb, line 515 515: def reads(re) 516: m = re.match(@line) or return nil 517: @line = m.post_match 518: m[0] 519: end
# File lib/racc/grammarfileparser.rb, line 429 429: def scan_action 430: buf = '' 431: nest = 1 432: pre = nil 433: @in_block = 'action' 434: begin 435: pre = nil 436: if s = reads(/\A\s+/) 437: # does not set 'pre' 438: buf << s 439: end 440: until @line.empty? 441: if s = reads(/\A[^'"`{}%#\/\$]+/) 442: buf << (pre = s) 443: next 444: end 445: case ch = read(1) 446: when '{' 447: nest += 1 448: buf << (pre = ch) 449: when '}' 450: nest -= 1 451: if nest == 0 452: @in_block = nil 453: return buf 454: end 455: buf << (pre = ch) 456: when '#' # comment 457: buf << ch << @line 458: break 459: when "'", '"', '`' 460: buf << (pre = scan_quoted(ch)) 461: when '%' 462: if literal_head? pre, @line 463: # % string, regexp, array 464: buf << ch 465: case ch = read(1) 466: when /[qQx]/ 467: buf << ch << (pre = scan_quoted(read(1), '%string')) 468: when /wW/ 469: buf << ch << (pre = scan_quoted(read(1), '%array')) 470: when /s/ 471: buf << ch << (pre = scan_quoted(read(1), '%symbol')) 472: when /r/ 473: buf << ch << (pre = scan_quoted(read(1), '%regexp')) 474: when /[a-zA-Z0-9= ]/ # does not include "_" 475: scan_error! "unknown type of % literal '%#{ch}'" 476: else 477: buf << (pre = scan_quoted(ch, '%string')) 478: end 479: else 480: # operator 481: buf << '||op->' if $raccs_print_type 482: buf << (pre = ch) 483: end 484: when '/' 485: if literal_head? pre, @line 486: # regexp 487: buf << (pre = scan_quoted(ch, 'regexp')) 488: else 489: # operator 490: buf << '||op->' if $raccs_print_type 491: buf << (pre = ch) 492: end 493: when '$' # gvar 494: buf << ch << (pre = read(1)) 495: else 496: raise 'racc: fatal: must not happen' 497: end 498: end 499: buf << "\n" 500: end while next_line() 501: raise 'racc: fatal: scan finished before parser finished' 502: end
# File lib/racc/grammarfileparser.rb, line 553 553: def scan_error!(msg) 554: raise CompileError, "#{lineno()}: #{msg}" 555: end
# File lib/racc/grammarfileparser.rb, line 521 521: def scan_quoted(left, tag = 'string') 522: buf = left.dup 523: buf = "||#{tag}->" + buf if $raccs_print_type 524: re = get_quoted_re(left) 525: sv, @in_block = @in_block, tag 526: begin 527: if s = reads(re) 528: buf << s 529: break 530: else 531: buf << @line 532: end 533: end while next_line() 534: @in_block = sv 535: buf << "<-#{tag}||" if $raccs_print_type 536: buf 537: end
# File lib/racc/grammarfileparser.rb, line 418 418: def skip_comment 419: @in_block = 'comment' 420: until m = /\*\//.match(@line) 421: next_line 422: end 423: @line = m.post_match 424: @in_block = nil 425: end
# File lib/racc/grammarfileparser.rb, line 331 331: def yylex0 332: begin 333: until @line.empty? 334: @line.sub!(/\A\s+/, '') 335: if /\A\#/ =~ @line 336: break 337: elsif /\A\/\*/ =~ @line 338: skip_comment 339: elsif s = reads(/\A[a-zA-Z_]\w*/) 340: yield [atom_symbol(s), s.intern] 341: elsif s = reads(/\A\d+/) 342: yield [:DIGIT, s.to_i] 343: elsif ch = reads(/\A./) 344: case ch 345: when '"', "'" 346: yield [:STRING, eval(scan_quoted(ch))] 347: when '{' 348: lineno = lineno() 349: yield [:ACTION, SourceText.new(scan_action(), @filename, lineno)] 350: else 351: if ch == '|' 352: @line_head = false 353: end 354: yield [ch, ch] 355: end 356: else 357: end 358: end 359: end while next_line() 360: yield nil 361: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.