##概要
言語に対して、文法表現と、それを使用して文を解釈するインタープリタを一緒に定義するパターン
以下の4種類のクラスからなる
- Abstract Expressionクラス(表現のインターフェイスを定義する)
- Terminal Expressionクラス(階層構造の終端の表現を実装)
- NonTerminal Expressionクラス(階層構造の節の表現を実装)
- Contextクラス(2,3が構文解析をおこなう上でのグローバルな情報を含む)
##具体例と実装
英文法と翻訳を例にすると、
上記1~4はそれぞれ
- 英文クラス(EnglishGrammerクラス。英文を解釈するインターフェイスを定義)
- 各種品詞クラス(Nounクラス、Verbクラス、Adjectiveクラス。英文を最小単位に分解した品詞部分の解釈を行う)
- 各種成分クラス(Subjectクラス、Predicateクラス、Objectクラス。英文を構造毎に分解した文の成分の解釈を行う)
- 原文クラス(OriginalSentenceクラス。今回は未定義)
が対応する。
コードの詳細は以下
english_grammer.rb
class EnglishGrammer
def interpret(sentence)
end
end
noun.rb
class Noun < EnglishGrammer
def interpret(parts_of_speech)
# 名詞を解釈
end
end
verb.rb
class Verb < EnglishGrammer
def interpret(parts_of_speech)
# 動詞を解釈
end
end
adjective.rb
class Adjective < EnglishGrammer
def interpret(parts_of_speech)
# 形容詞を解釈
end
end
subject.rb
class Subject < EnglishGrammer
def interpret(sentence_element)
# 主語を解釈
end
end
predicate.rb
class Predicate < EnglishGrammer
def interpret(sentence_element)
# 述語を解釈
end
end
object.rb
class Object < EnglishGrammer
def interpret(sentence_element)
# 目的語を解釈
end
end
##メリット
- 文法規則を表現するためにクラスを使っているため、文法の変更や拡張が容易
##まとめ
ドメイン特化言語を実装する際に使用するパターン