変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

コードのオブジェクト化

[javascript]spreadSheet4 コードのオブジェクト化

テキストを構文解析したパースした結果のオブジェクトは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':
        {
        }
    ....
  }
});

と、実行用オブジェクトを種類別に仕分けてコード化すれば何とかなるだろう。




top