プレイ日記
MIKI ifconfig
プチコンのサブセット言語処理系開発日記 今年作りたかったものの一つです。 https://miiverse.nintendo.net/replies/AYMHAAADAAB2V0frsssJbg どこまでできるかわからないけど、ミバ終了までここで進捗報告しますね。 変数宣言、関数定義、関数呼び出し、if then else endif、四則演算、print を実装したので、図のようなプログラムが PC で実行できるようになりました。
29そうだね
プレイ済み
返信[1]
親投稿
みなつ tksm372
おおおお、すごい~!(゜◇゜)
2そうだね
プレイ済み
返信[2]
親投稿
MIKI ifconfig
みなつさんありがとうございます。 目標は高くないので、あまり期待しないで下さいねw
1そうだね
プレイ済み
返信[3]
親投稿
MIKI ifconfig
一行 if はサポートしないつもりだったが endif のスペルが長すぎて断念。 となると、改行が文法に入ってくるので、文法まるまる書き直し。 泣きそうになったけどまあなんとかした。 (一行ifと複数行ifを分けた) とは言え if expr then while expr statement wend ↑これが一行 if として処理されることにww BASIC と yacc は相性が悪い・・・
1そうだね
プレイ済み
返信[4]
親投稿
よしと bm9007
yaccを使っているのですか。 応援します。
0そうだね
プレイ済み
返信[5]
親投稿
MIKI ifconfig
よしとさんありがとうございます!! yacc いいよね! yylex() は手書きです。 さて今回コンパイラとインタープリタは完全に分離して、それぞれ独立した実行ファイルにしてあります。 コンパイラの出力は double の配列になってて、インタープリタがそれを読んで実行します。 プチコンでもインタープリタを実装するつもりでいたのだけれど、出力を直接プチコンに持ってくる方法が無いことに気づいた・・・・ (petitmodem は double 非対応) 整数配列を経由するしかないか~~~~~~~
1そうだね
プレイ済み
返信[6]
親投稿
みなつ tksm372
( ゚∀゚)o彡゜ばいそん!ばいそん! ちなみに私はどちらも使えません(*ノノ)
0そうだね
プレイ済み
返信[7]
親投稿
MIKI ifconfig
「unixプログラミング環境」(水色表紙の本)の第8章に、四則演算から関数定義まで 6 段階にわたって実装していくすごく詳しいチュートリアル(70ページ)があります。 今回の実装も基本的にそれがベースになっています。 もし興味があるなら是非ご一読を!! 理系大学の図書館にならあるでしょう。 みなつさんなら難なく読めると思います。 今見たら某大手通販サイトで中古 575 円で売ってる!! これはほんとにいい本!! must buy!! Aho他の「コンパイラ―原理・技法・ツール〈1〉」は大学の教科書ですが、yacc の基礎となる理論について詳しい説明があります。
0そうだね
プレイ済み
返信[8]
親投稿
MIKI ifconfig
Aho の本は旧版(マンガ風の赤いドラゴン)の方です。第2版(CG風のドラゴン)は読んでません。
0そうだね
プレイ済み
返信[9]
親投稿
みなつ tksm372
おおお、ありがとうございますっ(≧∇≦)b 575円のほう、ぽちっちゃおうかにゃ~(・'ω'・)
0そうだね
プレイ済み
返信[10]
親投稿
MIKI ifconfig
print 文字列 を実装しました。 文字列は本来配列として実装すべきなのですが、配列の実装はまだまだ先のことになりそうなので、場当たり的に print の引数としてだけ文字列定数を指定できるようにしました。 これでやっと hello, world が表示できるようになりました。 ↓ print 12Hhello, world
2そうだね
プレイ済み
返信[11]
親投稿
MIKI ifconfig
命令版 def 実装中です。関数版 def との違いは戻り値があるかないかだけ、、、と思いきや、 out v1, v2 がありましたね。 これは p(double *v1, *v2) と考えることにして、呼び出し側は p(&v1, &v2) てな感じにしました。 本来は out 実引数は lvalue ですね。プチコンの lvalue は ・スカラ変数 ・文字列変数 ・配列変数[指標[,指標..]] ・文字列変数[指標] ・文字列配列変数[指標] ・文字列配列変数[指標][指標] ・var("スカラ変数名") ・var("文字列変数名") ・var("配列変数名")[指標[,指標..]] ・var("文字列変数名")[指標] ・var("文字列変数名")[指標][指標] がありますが、var 関数はサポートしない予定です。
1そうだね
プレイ済み
返信[12]
親投稿
MIKI ifconfig
てか現状は double 型のスカラ変数しか実装してません。
1そうだね
プレイ済み
返信[13]
親投稿
MIKI ifconfig
命令 def の処理でバグが・・・ def proc x: statements: end これで x がグローバル変数になってしまうというもの。 def func(x): statements: end では発生しません。なんでかなーと探ってったら 1. 識別子の解決を yylex() 側でやってて、 2. 名前空間の切り分け(global/local)は文法側から yylex に指示してる のがダメということが判明。 関数名/命令名を reduce した時に、yylex に対して「次からローカル変数な!」と指示してるのだけど、yacc は LALR(1) 法なので、常に token を一つ先読みします。
1そうだね
プレイ済み
返信[14]
親投稿
MIKI ifconfig
def func(x) の場合、'(' を先読みした時点で func が reduce されるので、そこで yylex に指示すれば、次の token 'x' はローカル変数になるが、 def proc x の場合、proc が reduce されるのは token 'x' を先読みし終えた時点。 なので、そこで「次からlocalな」と yylex に指示しても x は手遅れでグローバル変数として登録済み。 def 命令定義の場合に限ったら、def と proc の間で yylex に指示すればまあいいのだけれど、いちいち先読みを気にして構文解析するとかムリなので、解決方法としては構文解析側で識別子を解決するするしかないという結論。 これまで何回かオレオレ言語を作りましたが、名前空間を分けたことがありませんでした。 経験不足を痛感しますね。 GC も実装したこと無いのでお先真っ暗闇です。
1そうだね
プレイ済み
返信[15]
親投稿
MIKI ifconfig
あーこんなことメモってもミバ終わったらみられなくなっちゃうのかー 記憶のネットワークバックアップという意味では全く無意味だなーー
1そうだね
プレイ済み
返信[16]
親投稿
MIKI ifconfig
あ、思い出した!! 最初に書いたオレオレ言語では太古のLISPよろしく動的スコープを採用したんだった。 動的スコープの場合、実装上名前空間は一つだけでいいのよね。 なので yylex で一律管理できた。
1そうだね
プレイ済み
返信[17]
親投稿
えくる sixtie
miiverse終了後もどこかで情報が見られると嬉しいですネ。 わたしはまったく逆のアプローチでプチコン上にVM実装してバイナリレベルで互換って形にしていますが、スクリプト言語は興味深いです。 今後も頑張ってくださいね
0そうだね
プレイ済み
返信[18]
親投稿
MIKI ifconfig
予想では閉鎖後は今募集している手書きイラストのモザイクアートだけババーンと表示されるようになると思ってます。 今作ってる処理系も、中間コード(double配列)を吐き出して、実行は vm 担当です。 vmとかお好きなら、こちらのとかどうですか? http://www.boundvariable.org/um-spec.txt たった13個の命令だけ。 これはとあるプログラミングコンテスト用の vm です。 めちゃくちゃおもしろいです!! 参加者(日本人)の blog がわかりやすいかな。 http://shinh.hatenablog.com/entry/20060725/1153760624 プチコンでも実装できるのですが、メモリがかなり必要なので 3号では実行できません。 BIG ならいけるかもだけど、素直にCあたりで書くのがいいと思います。 私の実装だとCで382行.
1そうだね
プレイ済み
返信[19]
親投稿
よしと bm9007
yaccは使えません、ごめんなさい。 タバスコ君に引っ張られてやって来たロートルです。 ここのコメントもかろうじて理解、ギリギリです。 穴があったら入りたい。 余談ですがタバスコ君、お絵かきツール作ったみたい。 DLしたけど脱帽です。 でもまだまだ我流みたいですが。
0そうだね
プレイ済み
返信[20]
親投稿
MIKI ifconfig
まあ情報工学科でもなければ yacc 使う場面もそうそうないでしょう。 でも使ってみれば知識の地平線が一気にガーーーッと広がるのも事実。 ニュートンの言う「巨人の肩」に乗るみたいな。 興味があるのなら、先に紹介した中古書籍オススメ致します。 タバスコさんのお知り合いでしたか。 このコミュには、タバスコさんはもとより、若くて才気に溢れた将来有望な方がたくさんいらっしゃいますよね。 ほんとに将来が楽しみです!! 彼ら彼女らの中から優秀なプログラマが育つことを願ったりもしますが、 まあもちろんもっといい(マシな)選択肢もたくさんあるでしょうとも思いますww
1そうだね
プレイ済み
返信[21]
親投稿
呼ばれた気がしたので来てみました。 ボクの将来ってどうなっちゃうんでしょうね。
0そうだね
プレイ済み
返信[22]
親投稿
MIKI ifconfig
こういちさんの将来(就職~退職までの約40年)を決定づけるのは、 今この時の努力にかかっていると言っていいです。 中学高校の数年間の努力が、その後の何十年という人生を決めちゃう。 もうチートレベルですな。 こういちさんは私のプログラムなどもよく読まれてて、すごいなあと思います。間違いなく優秀なプログラマになれるでしょう。きっと他の分野でも。 選択肢は多いほうがいいです。選択肢を増やすのは、やはり今の努力次第ですよ。
1そうだね
プレイ済み
返信[23]
親投稿
よしと bm9007
実は私、情報工学部のプログラムからは比較的関係無い学科を出てます。 構文解析は学校で逆ポーランド記法w。 のときに二分木を作ったほか。自分でヴィルト先生の本を見ながら二分検索木を使ったプログラムを書いたりしました。 若い人はBASICをやってて、そんは無いと思います。 しかしミバも、もうすぐ終わりですね。
1そうだね
プレイ済み
返信[24]
親投稿
MIKI ifconfig
演算子の優先順位表使うやりかただと、大抵フラットに詰め込みますよね? 二分木使ったてことは、再帰下降法なのかな??? (pascal だし) 私もプログラム言語の原体験は pascal なので、未だ pascal の強い影響下にあります。 そういやプチコンでも再帰下降による式評価関数書きましたよ。 https://miiverse.nintendo.net/posts/AYIHAAAEAABEVRTuNIUIpQ ミバ終了は残念ですが是非もないですね。 スクショが困った・・・WiiU 買ってくるか・・・資金ないけど・・・
2そうだね
プレイ済み
返信[25]
親投稿
よしと bm9007
説明不足でした。 逆ポーランド電卓(笑)のあと。 数式から二分木を作って、演算子を前置、中置、後置の形で出力するのです。 また学校で、きちんと習ったのがPASCALが最初というだけで。 プログラム歴は。 お年玉とかで買ったFMーNEW7»ファミリーベーシック(笑)»IBM5550でPASCAL»いきなりFORTRAN»C言語»8086アセンブラ»以下独学でいろいろ»DelphiとかVBが出る(私の時代は終わった)»もちろん気合いでJAVAとか、まあいろいろ»»»»»プチコンmk2、年をとったから見にくい。»3号ほぼ持ってるだけ。 よく考えたらきちんと習ったのはPASCALだけでした。(笑) ブラック大学だったのでUNIXとXウインドウとか、そこに説明書(英語)あるからと先生に言われていきなり使わされました。 先生はマシン語しか使えませんでした、意味もなく長々と書きました、ごめん。
0そうだね
プレイ済み
返信[26]
親投稿
MIKI ifconfig
制御もできたので、あとは配列かと思ったけど、実際にこの処理系用のソース書いてたら、やっぱり型システムを導入しないとダメだなと思い始めたので、そっち進めます。 かなり大きな変更になるなあ・・・
2そうだね
プレイ済み