Changeset 108913 in webkit for trunk/Source/JavaScriptCore/offlineasm/parser.rb
- Timestamp:
- Feb 25, 2012, 4:19:07 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/offlineasm/parser.rb
r108444 r108913 24 24 require "ast" 25 25 require "instructions" 26 require "pathname" 26 27 require "registers" 28 require "self_hash" 29 30 class CodeOrigin 31 attr_reader :fileName, :lineNumber 32 33 def initialize(fileName, lineNumber) 34 @fileName = fileName 35 @lineNumber = lineNumber 36 end 37 38 def to_s 39 "#{fileName}:#{lineNumber}" 40 end 41 end 27 42 28 43 class Token … … 47 62 48 63 def to_s 49 "#{@string.inspect} at line#{codeOrigin}"64 "#{@string.inspect} at #{codeOrigin}" 50 65 end 51 66 … … 63 78 # 64 79 65 def lex(str) 80 def lex(str, fileName) 81 fileName = Pathname.new(fileName) 66 82 result = [] 67 83 lineNumber = 1 … … 71 87 # comment, ignore 72 88 when /\A\n/ 73 result << Token.new( lineNumber, $&)89 result << Token.new(CodeOrigin.new(fileName, lineNumber), $&) 74 90 lineNumber += 1 75 91 when /\A[a-zA-Z]([a-zA-Z0-9_]*)/ 76 result << Token.new( lineNumber, $&)92 result << Token.new(CodeOrigin.new(fileName, lineNumber), $&) 77 93 when /\A\.([a-zA-Z0-9_]*)/ 78 result << Token.new( lineNumber, $&)94 result << Token.new(CodeOrigin.new(fileName, lineNumber), $&) 79 95 when /\A_([a-zA-Z0-9_]*)/ 80 result << Token.new( lineNumber, $&)96 result << Token.new(CodeOrigin.new(fileName, lineNumber), $&) 81 97 when /\A([ \t]+)/ 82 98 # whitespace, ignore 83 99 when /\A0x([0-9a-fA-F]+)/ 84 result << Token.new( lineNumber, $&.hex.to_s)100 result << Token.new(CodeOrigin.new(fileName, lineNumber), $&.hex.to_s) 85 101 when /\A0([0-7]+)/ 86 result << Token.new( lineNumber, $&.oct.to_s)102 result << Token.new(CodeOrigin.new(fileName, lineNumber), $&.oct.to_s) 87 103 when /\A([0-9]+)/ 88 result << Token.new( lineNumber, $&)104 result << Token.new(CodeOrigin.new(fileName, lineNumber), $&) 89 105 when /\A::/ 90 result << Token.new( lineNumber, $&)106 result << Token.new(CodeOrigin.new(fileName, lineNumber), $&) 91 107 when /\A[:,\(\)\[\]=\+\-*]/ 92 result << Token.new( lineNumber, $&)93 else 94 raise "Lexer error at line number #{lineNumber}, unexpected sequence #{str[0..20].inspect}"108 result << Token.new(CodeOrigin.new(fileName, lineNumber), $&) 109 else 110 raise "Lexer error at #{CodeOrigin.new(fileName, lineNumber).to_s}, unexpected sequence #{str[0..20].inspect}" 95 111 end 96 112 str = $~.post_match … … 112 128 113 129 def isKeyword(token) 114 token =~ /\A((true)|(false)|(if)|(then)|(else)|(elsif)|(end)|(and)|(or)|(not)|(macro)|(const)|(sizeof)|(error) )\Z/ or130 token =~ /\A((true)|(false)|(if)|(then)|(else)|(elsif)|(end)|(and)|(or)|(not)|(macro)|(const)|(sizeof)|(error)|(include))\Z/ or 115 131 token =~ REGISTER_PATTERN or 116 132 token =~ INSTRUCTION_PATTERN … … 143 159 144 160 class Parser 145 def initialize( tokens)146 @tokens = tokens161 def initialize(data, fileName) 162 @tokens = lex(data, fileName) 147 163 @idx = 0 148 164 end … … 572 588 end 573 589 @idx += 1 590 elsif @tokens[@idx] == "include" 591 @idx += 1 592 parseError unless isIdentifier(@tokens[@idx]) 593 moduleName = @tokens[@idx].string 594 fileName = @tokens[@idx].codeOrigin.fileName.dirname + (moduleName + ".asm") 595 @idx += 1 596 $stderr.puts "offlineasm: Including file #{fileName}" 597 list << parse(fileName) 574 598 else 575 599 parseError "Expecting terminal #{final} #{comment}" … … 580 604 end 581 605 582 def parse (tokens)583 parser = Parser.new( tokens)606 def parseData(data, fileName) 607 parser = Parser.new(data, fileName) 584 608 parser.parseSequence(nil, "") 585 609 end 586 610 611 def parse(fileName) 612 parseData(IO::read(fileName), fileName) 613 end 614 615 def parseHash(fileName) 616 dirHash(Pathname.new(fileName).dirname, /\.asm$/) 617 end 618
Note:
See TracChangeset
for help on using the changeset viewer.