テキストを構文解析したパースした結果のオブジェクトはindexedDBに保存してあるけど、オブジェクトをテキストに戻したり、計算させるコードはJavaScriptのままだったので、中途半端だった。
あまり複雑なコトは出来なくていいので、オブジェクトをstringifyしたりcalulateしたりexecuteできるオブジェクトを考えてparserオブジェクトストアに保存すればいいかな?
そう考えると、まず俺々EBNFパーサで試してみるのが良さそうだ。
- パースするEBNFなテキストを用意する
- parserオブジェクトストアから俺々EBNFパーサを読みだす
- パース部分とパース結果を手直す部分に分離
- パース部分からdefinitionっぽいパーサ・コンビネーションを作る
- パース結果を手直す部分から実行コードを作る
- parseメソッドに先のテキストを読ませる
- 何かの構文解析パーサができる
な感じだろうか
とりあえずはmakeParserメソッドを「パースした結果のオブジェクト」っぽいオブジェクトに展開。
するところから始め、stringify、calculateも「パースした結果のオブジェクト」っぽいオブジェクトに展開してみよう。
多分、
{ function_definiton: { name: x..., procedure:[.....] } }
{ return: {expr:... } }
{ if:{expr:... }, then:{...}, else:{...} }
{ while:{expr }, procedure:[.....]},
{continue:null},
{break:null},
{ function:{name:x..., parameter:{... } } }
{ expr:[x..., '+', x..., ...] }
{ value:{ type;integer, value:1 } }
{ set:{ name:x... }, value:{ expr or value:.... } }
{ try:[...], catch:[...], finally:[...] }
とかになるんだろう。+-と/*演算子の優先度は{}のネストでカバーすればいいし。
{ export: x..., from y... }
{ import: x..., from y... }
も必要か、javascriptのコードの呼び出しは、事前に「{function_definiton」の内部に登録しておこう。
execObjectList.map((execObject) => {
switch() {
case 'function_definition':
{
}
....
}
});
と、実行用オブジェクトを種類別に仕分けてコード化すれば何とかなるだろう。