ズッキーニのプログラミング実験場

プログラミング + アカデミック + 何か面白いこと。 記載されているものは基本的に私が所属する団体とは関係がありません。

   May 14

[Parser][PEG]PEG.jsで遊んでみる

by zuqqhi2 at 2013年5月14日
Pocket

最近、文脈自由文法よりも扱える範囲が広いかもしれないと言われている
分析的形式文法(PEG)に興味があって、リッチなコンフィグファイル用言語を作成するのに使用している。

PEG.jsというPEG用のパーサを生成してくれるjsがgithub上に公開されていて、
これを使っている。
http://pegjs.majda.cz/

今作っている言語の文法は以下のように定義していて

start
= tree

tree
= stat:statement? { return stat; }

statement
= stat:if_statement { return stat.toString(); }
/ stat:proc_statement { return stat.toString(); }

if_statement
= fac:if_factor 'Y' edge branch1:proc_statement '\n'
'N' '\n' edge branch2:statement
{ return branch2.toString().match(/if/) ?
"if (" + fac + ")\n\t" + branch1 + '\nelse ' + branch2
: 'if (' + fac + ')\n\t' + branch1 + '\nelse\n\t' + branch2;}

proc_statement
= fac1:proc_factor [-|]+ fac2:proc_statement { return fac1 + '.then(' + fac2.slice(0,fac2.length-1) + ');'; }
/ factor:proc_factor { return factor + ';'; }

proc_factor
= '[' procexp:expression ']' { return procexp; }
if_factor
= '<' ifexp:expression '>' { return ifexp; }

expression
= elem:element ' ' cdr:arguments { return elem.toString() + '(' +cdr + ')'; }
/ elem:element { return elem.toString(); }

arguments
= elem:element ',' arg:arguments { return elem.toString() + ',' + arg; }
/ elem:element { return elem.toString(); }

element
= characters:[a-zA-Z0-9-_."]+ { return characters.join('') }

edge
= symbols:[-|\n]+ { return symbols.join('') }

例えば次のような文章を解析できる。

<hasTwitterAccount id>Y---[getTweet id]---[outputTweets]
N
|
|
<hasYoutubeAccount id>Y-----[youtube_search keyword,30]
N
|
|
|
|
|
[alert "nothing"]

github上のリポジトリはこれ

Related Posts

  • 2013年6月2日 [Backbonejs][Javascript]インストール Backbone.jsの準備 まずは必要なライブラリのダウンロード。 次は、テスト用のhtmlとjsを作成。 動作確認して準備OK! coffee scriptを加えてみる ここを 参考にしてnpmを入れる。 […]
  • 2013年5月29日 [Javascript]Three.jsを触る Three.jsでブラウザ上で3D空間の描画が簡単にできるみたいだ。 threejs.org 簡単に立方体を書いてみる。 以下、ここのまねをして書いてみる。 まずはダウンロード。 ここのbuildディレクトリの中にあるthree.min.jsを使う。 […]
  • <!--:ja-->[Javascript][Meteor.js]インストールとHello World<!--:--><!--:en-->[Javascript][Meteor.js]Install and Hello World<!--:-->2015年2月15日 [Javascript][Meteor.js]インストールとHello World Meteor.js Meteor.jsはJavascriptのサーバサイドフレームワークの1つ。 Node.jsをベースにしているが、いろいろと違う。 面白いところは、クライアントとサーバ間でソースコードやDBの内容を共有できるところ。 これのおかげで簡単にWe […]
  • 2013年6月27日 [Javascript][Node.js][express]mongodbと連携させてみる mongodbを使って値の保存、読み出しを使ったプログラムを作成してみる。 まずは expressを使用してひな形を作成する。 次にmongodbとの接続に使用するモデルを作成する。 […]
  • 2013年8月18日 [node.js]webサイトのクローリング用ライブラリ cheerio 以下のライブラリを利用する。 requestは対象URLからのデータ取得に用いて、 cheerioはその取得したデータをDOM解析するために使用する。 例えばこんな感じで使用出来る。 I'll use libraries which are […]
  • <!--:ja-->[node.js]jQuery Deferred を使ってみる<!--:--><!--:en-->[node.js]Try to use jQuery Deferred<!--:-->2013年9月8日 [node.js]jQuery Deferred を使ってみる やりたいこと jQuery […]
Pocket

You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.