Parsletを利用してオレオレスクリプトを作成する
はじめに
ParsletとはRubyで書かれたPEG(Parsing Expression Grammar)ベースの構文解析器です。こちらのgemを利用すると、Rubyのコードでエレガントに構文解析を記述することができます。
2020年には小学生のプログラミング教育が義務化されると言われている昨今、エンドのITリテラシーも向上の一途を辿っております。だからこそ、UIによる操作と併せまして、我々が黒い画面で触れるようなスクリプトをインタフェースとして、エンドに提案する日も近いのではないかと感じております。
実装
Parsletは以下の3つの側面からスクリプトを定義します。
- parser
- transformer
- engine
parserは読んで字の如く、構文解析を行います。非常に特徴的なコードとなるので、exampleを確認して頂ければ、ぱっと見た感じでスルッとご理解して頂けるのではないでしょうか。主に言語仕様の見た目を定義します。
transorfmerはparserによって解析された対象を木構造(AST)に整形して、enginに引き渡す役割を担っています。
engineはtransformerから渡された情報を元に、Rubyのコードを利用して何かしらの処理を行います。この処理如何によって、どのような機能をスクリプトに提供するのかが決定されます。(ソースコード中のコメントでは、engineではなくdocumentとしてサンプルが記載されております)
そして以下の通り、上記の3つを組み合わせることで、定義したオレオレスクリプトを駆動させることができます。データ(data)に対してオレオレスクリプト(oreore_script)を実行する例です。
上記のデータ(data)については、色々と思い当たることかと存じます。それはたとえば、ウェブをクロールして得たテキストかも知れませんし、センサーから上がってきたバイナリかもしれません。
これらデータに対して、特定の字句を発見したらAPIリクエストを行うだとか、一定以上の値が発見されたら担当者にメールを配信するだとか、その手の処理をengineに記述し、これをオレオレスクリプト(oreore_script)から呼び出します。
ParserやTransformerの細かい実装方法については、Qiitaに素敵な記事が挙がっておりましたので、そちらをご参照下さい。Transformerからengineを呼び出す箇所についてのみ、サンプルコードを記載させて頂きます。
Transformerのインスタンスに渡したengineを内部でコールします。処理を委譲させることで、Transformerのコードが綺麗になります。また、engineを使い分けることによって、構文規則をそのままに処理を動的に変更することも可能です。
ここ数年、ウェブアプリのフロントエンドが進歩するに応じて、UIは複雑怪奇なものとなってきております。故にエンドの属性やユースケースの如何によっては、CIを提供した方がユーザにとってもありがたい場合があるのではないか、などと考えております。