DSL / Syntactic Analysis Strategy


DSL

タイトル

Syntactic Analysis Strategy

一言要約

構文解析の戦略を紹介(Delimiter Directed TranslationとSyntax Directed Translation)

要約

・構文解析とは、定義を認識すること。 (本文には次のように例を挙げて定義している「event doorClosed D1CLの行がイベントを定義しており、それがコマンド定義ではないことを述べていることを認識すること」)

・定義を認識すると、   [Tree Constructionを使用している場合]構文木にできる   [Embedded Translationを使用している場合]セマンティックモデルにできる。

・Delimiter Directed Translationは、デリミタ文字を使用してステートメントを分解。通常はマーカーが存在する。非常に仕組みが簡単で正規表現などで実装する。でも階層的な文脈は扱えない。

例)

 events
   doorClosed D1CL
   drawOpened D2OP 
 end

・Syntax Directed Translationなら階層的な文脈をあつかえる。構文はBNF記法で定義し、パーサを生成することもできる。汎用言語では必須。

例)

 list : eventList commandList;
 eventList : 'event' eventDec* 'end';
 eventDec  : identifier identifier;
 commandList : 'command' commandDec 'end';
 commandDec : identifier identifier; 

・Syntax Directed Translationは、非常に難しい印象を持っている人が多いが、それは汎用言語のパースを基準に考えているから(DSL程度ならばそんなに難しくない)

・Syntax Directed Translationは、字句解析と構文解析の2段階が行われる。

・字句解析では、入力文を取り込み、トークンのストリームに変換する。トークンは型と内容を保持。

例) "state idle" 文は2つのトークン[内容: "state', 型: state-keyword][内容: "idle", 型: identifier]となる。

・字句解析器が構文解析の前に作業を行うので、文をどのように使用するか注意深くなるべき。(Pythonのようなコード構造を取り扱うために空白を使用している場合に空白の扱い難しい)

ファウラーへのフィードバック

担当者のつぶやき

・「このような(字句解析と構文解析の)分離を行う理由は、2つの要素をそれぞれ書く方が簡単になるからですが、同時に特にこれらのツールが元々設計されたような制限のあるハードウェアにおいては性能が向上するからです。」 (←山下 そうなんですか?)

・ねむた〜い。ねむた〜い。


みんなの突っ込み