###前提・実現したいこと
Peg.jsを使って四則演算や独自のif文、関数が解釈できるパーサーを作成したいです。
HTMLとjavascriptでWebアプリケーションを作成しています。
その機能の一つとして、テキストエリアやコンボボックスに対して独自の構文スクリプトを設定しそのスクリプトを実行させたいです。
例えば、テキストエリアA・テキストエリアBがあり、テキストエリアAに「if(#[テキストエリアB] = "", MyValue(), #[テキストエリアB])」という構文が設定されているとします。この構文の意味は「テキストエリアBが空白の場合はテキストエリアAの値を設定し、そうでなければテキストエリアBの値を設定する」という意味です。
質問内容としては、javascriptで構文解析をしたいのですが自力でゼロから作るのは難しいと思っています。
そこで調査したところ、Peg.jsなるものを見つけました。
そのPeg.jsで不明点がいくつかあります。
###発生している問題・エラーメッセージ
まずhttp://pegjs.org/onlineにサンプルがあるのでこれから勉強しようと思っているのですがサンプルの構文に分からないところがあります。
1.一番下に「_」をスペースとして定義している箇所があります。スペースは「 \t\n\r」の繰り返しからなっている。ということは分かるのですが、「"whitespace" 」は何のための記述かわかりません。
2.Integerの定義に「text()」という関数が呼ばれていますが何ものでしょうか。
3.Termの定義に関してはお手上げ状態です。tailという変数が突然出てきますし添え字の意味も不明です。
4.このサンプルでは四則演算ができ、「2 * (3 + 4)」と与えれば3 + 4を先に評価していますがどこの定義で優先での指定をしているのでしょう。
質問も漠として申し訳ありませんがご回答いただければ幸いです。どうぞよろしくお願いいたします。
※Peg.jsにこだわるつもりはなく他にも実現方法などがあればぜひご教示ください。
###該当のソースコード
Expression = head:Term tail:(_ ("+" / "-") _ Term)* { var result = head, i; for (i = 0; i < tail.length; i++) { if (tail[i][1] === "+") { result += tail[i][3]; } if (tail[i][1] === "-") { result -= tail[i][3]; } } return result; } Term = head:Factor tail:(_ ("*" / "/") _ Factor)* { var result = head, i; for (i = 0; i < tail.length; i++) { if (tail[i][1] === "*") { result *= tail[i][3]; } if (tail[i][1] === "/") { result /= tail[i][3]; } } return result; } Factor = "(" _ expr:Expression _ ")" { return expr; } / Integer Integer "integer" = [0-9]+ { return parseInt(text(), 10); } _ "whitespace" = [ \t\n\r]*
###補足情報(言語/FW/ツール等のバージョンなど)
このアプリケーションはWindowsのアプリとしてあるのですがそれをHTML版に作り替えることになっています。