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
Modulo : abc
robintux
0
240
Quality Control of Crude Drugs
pawan_pharm
0
200
2026年度秋学期 統計学 第3回 クロス集計と感度・特異度,データの可視化 (2026. 10. 13)
akiraasano
PRO
0
260
AWS Academy プログラムのご紹介
hiragahh
0
110
Web Application Frameworks - Lecture 3 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
DRONEGEOGRAFÍA: INNOVACIÓN DIDÁCTICA Y FOTOGRAMETRÍA 3D PARA LA COHESIÓN TERRITORIAL Y LA CIUDADANÍA ACTIVA
juanmartin2026
0
41k
2026年度秋学期 統計学 第1回 イントロダクション ー 統計的なものの見方・考え方について (2026. 9. 29)
akiraasano
PRO
0
260
Web Architectures - Lecture 2 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
Adobe Express
matleenalaakso
2
8.4k
CLASSIFICATION OF CRUDE DRUGS
pawan_pharm
0
220
生成AIとの付き合い方/ How to work with AI
kaityo256
PRO
3
890
ちいかわを読め
uchi8977
1
410
Featured
See All Featured
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
Ruling the World: When Life Gets Gamed
codingconduct
0
400
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
A Soul's Torment
seathinner
8
3.8k
ラッコキーワード サービス紹介資料
rakko
1
5.4M
Designing for humans not robots
tammielis
254
26k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
Design in an AI World
tapps
1
350
Faster Mobile Websites
deanohume
310
32k
Darren the Foodie - Storyboard
khoart
PRO
4
4k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
The Language of Interfaces
destraynor
162
27k
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')