|
![]() | |
|
全く実現できないことを色々と、広大に妄想をしてみることがあります。 「NEOBRASTER」や「御神楽」「巫女ブラスター」をスマホゲームにしてみたいとか。 NumLockLock、マウスふるふる、マウスのお供などのタスクバーの通知領域(タスクトレイ)常駐系のソフトを1つにまとめ、1つのアイコンから操作できるようにしたいとか。 いずれも、理論上は実現可能であり、十分な時間を確保できれば、あと需要を一切顧みなければ実現できます。 ただ、どうやってモチベーションを喚起するか、作った後のメンテナンスはどうしようか、考えれば考えるほど現実に引き戻されてしまい、作ることはないものとなります。 最近考えたのは、いじくるつくーる(Rnsf ver.7)から、R-Scriptを分離・独立させたいという妄想です。 C++からPythonを呼び出せるBoost.Pythonとか、C言語からLuaスクリプトを呼び出したりとか、まぁ、現実に存在するアイディアではあるんですが、そのうちの1つとして列挙されるようにしたい。 ソースコードはダウンロードページで公開しているので、展開してがんばれば見れる状態にはなっておりまして、lexとyaccで文法ルールを定義して式の実行・分岐・繰り返し・関数呼び出しなどを行い、関数としてC言語で用意している機能を呼び出すことで、様々な機能(レジストリの読み書き、ダイアログの構成等)を実行するという構成になっています。 ![]() ▲R-Script(いじくるつくーる)の文法定義(yacc) 文法定義は、こういうやつですね。 func : symbol '(' args ')' 略 args : arg ',' args 略 | arg | (なし) arg :数 略 :文字列 略 『関数とは、「シンボル(引数群)」であり、「引数群とは引数,引数群」であり、引数群は空もあり得て…』みたいなのを延々と書き並べるのが、コンピュータ言語における文法定義になります。 これはkmyaccというMS-DOS時代のプログラムでコンパイルしているので、16bitプログラムを呼び出せなくなった現代のWindowsではコンパイルすることができません。 過去の32bit時代のWindowsを仮想環境で実行して呼び出すとか、Windows用のyacc(あるいはbison)を持ってきて対応させるとかしないといけないです。 プリインタプリトと文法まわりを解決した後は、関数として用意する各機能の準備、ダイアログ制御(編集ボックス・リストビュー等の中身を追加・削除するなど)。こっちは比較的持ってきやすいかもしれないですが、現行のプログラムはUnicode対応していないので、Unicode用に作り直すのがツラそう。まぁ、変数・配列管理、ファイル操作・テキスト操作・文法拡張のための関数だけ連れてきて、ダイアログ制御やレジストリ操作の機能は連れてこないという選択肢もありか。 まぁなかなか、現在これをやるには敷居が高そうだなぁ、そもそも需要もないだろうしなぁ、時間も確保できないなぁ…。 需要はなくもないか。改行コード変換による文字列置換のルール記述にスクリプトを使えるようにするとか、マウスふるふるのマウスの動きの定義方法にスクリプトを使えるようにするとか、NumLockLockで制御対象にするアプリの選別にスクリプトを使えるようにするとか、マウスのお供でマウスのそばに表示する文字列の作成にスクリプトを使えるようにするとか、使い道を思い浮かべようとすればいくらでも出てきそう。そのために、プログラムサイズがデカくなることには、目をつぶっておくことにして…。 そんな妄想です。 あ、生成AIに全部食わせたら、自動でやってくれたりしないかなぁ。 Boost.PythonとかLuaを使えばすぐに実現できますとかは言わないように…。 プログラミングで一番面白いことの1つは、車輪の再発明なので。 あ、R-Scriptって、レジストリの値型に合わせて、整数は0以上しか扱えないんだった。 言語仕様がこれだと、(マウスふるふるで)マウス(の画面上の座標の数値)を左や上に動かす準備のために変数に数字(負の数)を入れようとしただけで詰むな。やっぱりダメそうだな。 というわけで、どうせやるならば、次の事は必須事項になりそう。 ・数値型として負の整数も扱えるようにする ・Unicode対応(Win32のC++なのでUTF-16LEを扱う。サロゲートペアの扱いは後からかな。😀とかは、当初は扱えなくてもいいかな) ・スクリプト呼び出し元のC言語関数をコールバックできるようにする(マウスふるふるに、スクリプトからマウスを動かせる仕組みを提供させてコールバック関数のように呼びだせるようにする) 必須ではないけどやっておきたいこと。 ・制御(if, whileなど)も文法として扱いたい。(いじくるつくーるのR-Scriptでは、if/while/forなどは、単純な評価+GOTO文に変換するプリインタプリタを介して実行していた) ・文法解析の副作用で実行するのではなく、文法定義と実行を分離 ・↑これらを実装する中で、blockを0行以上のstatementsと文法定義し、statementsは順次実行するものとして作り直したい 消したい要素。 ・代入文を評価式にしない(ifの中で代入を使おうとしたらエラーにする。代入文の結果を他の変数に代入する使い方は破棄) ・for(時間あれば作り直したい) ・goto ・2段階以上外に出るbreak/continue これらを総合して、ChatGPTに相談してみたら、Boost.spiritをお勧めしてくれた。以前、Boostの本を買わせてもらったk.inabaさんの紹介によると、四則演算+カッコを処理するプログラムが、こんな感じで書けるっぽい。 プリコンパイルヘッダに必要なヘッダファイルを突っ込んだら、「メモリが足りないから /Zm*** で増やせ」と言われてしまったのでその通りに増やしたら、無事にビルドが通りました。 C++のオバケサイズヘッダあるあるだなぁ。 で、無事に正しく動きました。なるほど。これは面白そう。 あとは「文法解析の副作用で実行するのではなく、文法定義と実行を分離」を実現するために、セマンティックアクションで四則演算を実行している箇所を除去して、それをvisitorというかexecutorとして実装するようにする感じか。 目次の表示: ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメール、フィードバックまたはTwitter等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。 当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。 |
- 最近の更新 - |
|
|
3433669 (+0588)[+0959] Copyright© 2010-2026 INASOFT | ||