parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-iyadurai-parsingrubyreloaded.pdf · raise...

29
Parsing Ruby Rathesan Iyadurai 1

Upload: others

Post on 08-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

Parsing Ruby

Rathesan Iyadurai

1

Page 2: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

Goal

2

Extract all classes and their methods without having to define the complete

grammar of Ruby.

Page 3: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

Previously on “Parsing Ruby”

Page 4: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

4

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark if age > 3 puts "wuff" else puts "wiff" end end

end

Page 5: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

5

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark if age > 3 puts "wuff" else puts "wiff" end end

end

Page 6: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

6

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark if age > 3 puts "wuff" else puts "wiff" end end

end

Page 7: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

7

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark if age > 3 puts "wuff" else puts "wiff" end end

end

Page 8: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

8

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark if age > 3 puts "wuff" else puts "wiff" end end

end

Page 9: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

'foo class bar' "foo class bar"

%?foo class bar? %{foo class bar} %<foo class bar> %(foo class bar) %[foo class bar] %q{foo class bar} %Q{foo class bar}

<<spongebob.strip foo class bar spongebob

9

Page 10: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

Modifiers

10

Page 11: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

11

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark if age > 3 puts "wuff" else puts "wiff" end end

end

Page 12: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

12

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark str = if age > 3 "wuff" else "wiff" end puts str end

end

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark if age > 3 puts "wuff" else puts "wiff" end end

end

Page 13: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

13

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark str = if age > 3 "wuff" else "wiff" end puts str end

end

Page 14: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

14

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark str = if age > 3 "wuff" else "wiff" end puts str end

end

modifier := startOfLine , stuffToConsume , newline not , '=' not , 'if'

Page 15: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

15

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark str = if age > 3 "wuff" else "wiff" end puts str end

end

modifier := startOfLine , stuffToConsume , newline not , '=' not , 'if'

Page 16: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

16

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark str = if age > 3 "wuff" else "wiff" end puts str end

end

modifier := startOfLine , stuffToConsume , newline not , '=' not , 'if'

Page 17: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

17

class Dog

attr_accessor :age

def initialize(age) raise "NOO" if age < 1

@name = "foo class bar" @age = age end

def bark str = if age > 3 "wuff" else "wiff" end puts str end

end

modifier := startOfLine , stuffToConsume , newline not , '=' not , 'if'

Page 18: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

~ 50 rules

10 for matching “end”s

13 for keywords

18

10 for strings and comments

Page 19: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

Keywords

def if endless bado end.class

19

Page 20: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

Keywords

def if endless bado end.class

20

Page 21: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

String Interpolationname = "Jan" "Hi #{name}!" # => "Hi Jan!"

"Hi #{class Dog; end}"

"Hi #{puts ""}"

"Hi #{list.each { |l| foo }}"

21

Page 22: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

https://github.com/jruby/jruby-parser

vs

22

Page 23: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

class Dog end if foo?

23

Page 24: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

Now what?

24

Page 25: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

def foo a = "i'm a local variable!" b end

def b "i'm a method!" end

25

Page 26: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

def foo(arg) a = "i'm a local variable!" arg.b end

26

Page 27: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

Overview

Goal: Extract all classes and their methods without having to define the complete grammar of Ruby

Problems: modifiers, keywords, string interpolation

Goal achieved?

27

Page 28: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

0

500

1000

1500

2000

2500

3000

0 5000 10000 15000 20000 25000 30000 35000 40000 45000

Milli

seco

nds

Number of Characters

RubyGrammar Performance

smooth milliseconds per character count

Page 29: parsing ruby reloaded - scg.unibe.chscg.unibe.ch/...03-23-Iyadurai-ParsingRubyReloaded.pdf · raise "NOO" if age < 1 @name = "foo class bar" @age = age end def bark str = if age

0

500

1000

1500

2000

2500

3000

0 20 40 60 80 100 120

Milli

seco

nds

Number of Methods

RubyGrammar Performance

smooth milliseconds per method count