LoginSignup
0
0

More than 5 years have passed since last update.

【デザインパターン】 Interpreterパターン

Posted at

概要

言語に対して、文法表現と、それを使用して文を解釈するインタープリタを一緒に定義するパターン

以下の4種類のクラスからなる
1. Abstract Expressionクラス(表現のインターフェイスを定義する)
2. Terminal Expressionクラス(階層構造の終端の表現を実装)
3. NonTerminal Expressionクラス(階層構造の節の表現を実装)
4. Contextクラス(2,3が構文解析をおこなう上でのグローバルな情報を含む)

具体例と実装

英文法と翻訳を例にすると、

上記1~4はそれぞれ

  1. 英文クラス(EnglishGrammerクラス。英文を解釈するインターフェイスを定義)
  2. 各種品詞クラス(Nounクラス、Verbクラス、Adjectiveクラス。英文を最小単位に分解した品詞部分の解釈を行う)
  3. 各種成分クラス(Subjectクラス、Predicateクラス、Objectクラス。英文を構造毎に分解した文の成分の解釈を行う)
  4. 原文クラス(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

メリット

  • 文法規則を表現するためにクラスを使っているため、文法の変更や拡張が容易

まとめ

ドメイン特化言語を実装する際に使用するパターン

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0