Archive for the 'PEGKit' Category

2015/11/18 PEGKitのじっけん

オープンソースのプロジェクト「PEGKit」(By Todd Ditchendorf)を用いて、プログラムの文字列をparseする実験を行ったAppleScriptです。

PEGKitはParsing Expression Grammar toolkitであり、「定義された文法にもとづいて文字列をparseする」ものです。プログラミング言語や数式のparseを行う目的で作られたもの、と自分は理解しています。日本語や英語のような自然言語のparseを行うものではありません。

数式のparseを行うためのチュートリアルがこちらに存在しています。

何か目的があって首を突っ込んだわけではないのですが、数式のparseを行うサンプルを読んでいると、「少ない労力で文字列をparseするルールを定義できそう」という印象を受けます。

本ScriptはPEGKitのTokenizerのサンプル(Objective-C)をAppleScriptに翻訳したものであり、PEGKitの働きを端的に把握できるよい例だと思います。

“2 != -47. /* comment */ Blast-off!! ‘Woo-hoo!’ // comment”

という、なんとなくプログラミング言語っぽい文字列を文法要素ごとにparseして、それがstringなのかsymbolなのかnumberなのかwordなのかといった文法上の区分を認識しつつ出力し、明らかにコメントっぽい部分は読み飛ばすという動きをしています。

例によって、OS X 10.10以降用にビルドしたバイナリを用意しておきましたので、興味のある方はアーカイブを展開したあとで、~/Library/Frameworksに入れておためしください。

–> Download PEGKit framework binary

AppleScript名:PEGKitのじっけん
– Created 2015-11-18 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “PEGKit” –itod/pegkit
–https://github.com/itod/pegkit

set s to “2 != -47. /* comment */ Blast-off!! ’Woo-hoo!’ // comment”
set t to current application’s PKTokenizer’s tokenizerWithString:s

set anEOF to current application’s PKToken’s EOFToken()

repeat
  set tok to (t’s nextToken())
  
if tok = anEOF then exit repeat
  
  
set aVal to tok’s stringValue()
  
–set bVal to tok’s floatValue() –??? — -[PKToken floatValue]: unrecognized selector sent to instance 0×7f87c818
  
set cVal to tok’s debugDescription()
  
log {aVal, cVal} –Cocoa logging is available in only ASObjC Explorer 4
  
  
– (* {(NSString) “2″, (NSString) “Number «2»“} *)
  
– (* {(NSString) “!=”, (NSString) “Symbol «!=»“} *)
  
– (* {(NSString) “-47″, (NSString) “Number «-47»“} *)
  
– (* {(NSString) “.”, (NSString) “Symbol «.»“} *)
  
– (* {(NSString) “Blast-off”, (NSString) “Word «Blast-off»“} *)
  
– (* {(NSString) “!”, (NSString) “Symbol «!»“} *)
  
– (* {(NSString) “!”, (NSString) “Symbol «!»“} *)
  
– (* {(NSString) “’Woo-hoo!’”, (NSString) “Quoted String «’Woo-hoo!’»“} *)
  
end repeat

★Click Here to Open This Script