Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Паттерны проектирования 6.2
Search
Vitaly Shlyaga
December 14, 2012
Education
100
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Паттерны проектирования 6.2
Паттерн Интерпретатор.
Vitaly Shlyaga
December 14, 2012
More Decks by Vitaly Shlyaga
See All by Vitaly Shlyaga
Разработка веб-приложений 01
storkvist
0
160
Паттерны проектирования 6.1
storkvist
0
150
Паттерны проектирования 5.1
storkvist
0
140
Паттерны проектирования 5.2
storkvist
1
120
Паттерны проектирования 4.1
storkvist
2
120
Паттерны проектирования 4.2
storkvist
1
100
Паттерны проектирования 3
storkvist
0
120
Паттерны проектирования 2
storkvist
0
280
Паттерны проектирования - 1.pdf
storkvist
0
420
Other Decks in Education
See All in Education
Sekolah Sabat - Triwulan 4 2026 - Pelajaran 1
hiola
0
13k
新型コロナ禍をともに「楽しみながら開いていこう!」 :中門 吉松 会員(2720 Japan O.K.ロータリーEクラブ)卓話 : 2026.10.19.例会・卓話
2720japanoke
0
300
Introduction to Accounting
bvr7352
0
270
吉岡研究室紹介(2026年度)
kentaroy47
0
380
未踏峰連山 Frontiers: Creating and Conquering Untrodden Peaks
ishii_mit
1
170
学生のうちに考えておきたい信頼の話
suisan
1
840
日本における応用言語学・言語教育学これまでとこれから
terasawat
0
170
INTRODUCTION TO THE CELL
pawan_pharm
0
330
[2026後期火5] 論理学(京都大学文学部 後期 第2回)「量化子の導入」
yatabe
0
180
オンラインコミュニティ TRY部 体験マニュアル
ytapples613
0
390
Railsチュートリアル × 反転学習の事例紹介
yasslab
PRO
3
190k
Sekolah Sabat - Triwulan 3 2026 - Pelajaran 13
hiola
0
11k
Featured
See All Featured
Ruling the World: When Life Gets Gamed
codingconduct
0
400
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
1k
How to make the Groovebox
asonas
2
2.5k
Skip the Path - Find Your Career Trail
mkilby
1
260
Are puppies a ranking factor?
jonoalderson
2
4.1k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
Writing Fast Ruby
sferik
630
63k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
460
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
890
Into the Great Unknown - MozCon
thekraken
41
2.8k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Transcript
Паттерны проектирования часть 6.2
Интерпретатор Поведенческий шаблон проектирования, решающий часто встречающуюся, но подверженную изменениям,
задачу.
Абстрактное синтаксическое дерево терминалы и нетерминалы
Интерпретатор
Интерпретатор require 'find' class Expression #... end class All <
Expression def evaluate(dir) results= [] Find.find(dir) do |p| next unless File.file?(p) results << p end results end end
Интерпретатор class FileName < Expression def initialize(pattern) @pattern = pattern
end def evaluate(dir) results= [] Find.find(dir) do |p| next unless File.file?(p) name = File.basename(p) results << p if File.fnmatch(@pattern, name) end results end end
Интерпретатор expr_all = All.new files = expr_all.evaluate('test_dir') expr_mp3 = FileName.new('*.mp3')
mp3s = expr_mp3.evaluate('test_dir')
Интерпретатор class Bigger < Expression def initialize(size) @size = size
end def evaluate(dir) results = [] Find.find(dir) do |p| next unless File.file?(p) results << p if( File.size(p) > @size) end results end end
Интерпретатор class Writable < Expression def evaluate(dir) results = []
Find.find(dir) do |p| next unless File.file?(p) results << p if( File.writable?(p) ) end results end end
Интерпретатор class Not < Expression def initialize(expression) @expression = expression
end def evaluate(dir) All.new.evaluate(dir) - @expression.evaluate(dir) end end expr_not_writable = Not.new( Writable.new ) readonly_files = expr_not_writable.evaluate('test_dir') small_expr = Not.new( Bigger.new(1024) ) small_files = small_expr.evaluate('test_dir') not_mp3_expr = Not.new( FileName.new('*.mp3') ) not_mp3s = not_mp3_expr.evaluate('test_dir')
Интерпретатор class Or < Expression def initialize(expression1, expression2) @expression1 =
expression1 @expression2 = expression2 end def evaluate(dir) result1 = @expression1.evaluate(dir) result2 = @expression2.evaluate(dir) (result1 + result2).sort.uniq end end big_or_mp3_expr = Or.new( Bigger.new(1024), FileName.new('*.mp3') ) big_or_mp3s = big_or_mp3_expr.evaluate('test_dir')
Интерпретатор class And < Expression def initialize(expression1, expression2) @expression1 =
expression1 @expression2 = expression2 end def evaluate(dir) result1 = @expression1.evaluate(dir) result2 = @expression2.evaluate(dir) (result1 & result2) end end
Интерпретатор complex_expression = And.new( And.new(Bigger.new(1024), FileName.new('*.mp3')), Not.new(Writable.new )) complex_expression.evaluate('test_dir') complex_expression.evaluate('/tmp')
# and (and(bigger 1024)(filename *.mp3)) writable class Parser def initialize(text)
@tokens = text.scan(/\(|\)|[\w\.\*]+/) end def next_token @tokens.shift end def expression token = next_token if token == nil return nil elsif token == '(' result = expression raise 'Expected )' unless next_token == ')' result elsif token == 'all' return All.new elsif token == 'writable' return Writable.new elsif token == 'bigger' return Bigger.new(next_token.to_i) elsif token == 'filename' return FileName.new(next_token) elsif token == 'not' return Not.new(expression) elsif token == 'and' return And.new(expression, expression) elsif token == 'or' return Or.new(expression, expression) else raise "Unexpected token: #{token}" end end
Интерпретатор parser = Parser.new "and (and(bigger 1024)(filename *.mp3)) writable" ast
= parser.expression
Интерпретатор class Expression def |(other) Or.new(self, other) end def &(other)
And.new(self, other) end end #Or.new( # And.new(Bigger.new(2000), Not.new(Writable.new)), # FileName.new('*.mp3')) (Bigger.new(2000) & Not.new(Writable.new)) | FileName.new("*.mp3")
Интерпретатор def all All.new end def bigger(size) Bigger.new(size) end def
name(pattern) FileName.new(pattern) end def except(expression) Not.new(expression) end def writable Writable.new end # (bigger(2000) & except(writable) ) | file_name('*.mp3')