プログラミングタグ

プログラム言語作成の順番

よくあるプログラム言語の作成の本って
字句解析→構文解析→中間言語
ってウォーターフォールっぽく進むじゃないですか

僕もそういう本。結構、読んだんですけど
順番が逆じゃないのかな?と思うんですよね
中間言語とかいってそれはなくてもいいと思うんですけど
まああってもいいんですがw
内部表現と記述しましょうか

内部表現の仕様をしっかり把握してないと
構文解析のアウトプットの仕方を構成出来ないし
構文解析の仕組みを把握してないと字句解析出来ないんじゃないかな?
と思うんです

なんでそう思うかというと
簡単めの書籍で
入力を一行単位で入力してるんです
まあ最初の方なんですけど
字句解析も構文解析もすっとばして
いきなり内部表現にアクセスしてる訳ですな
そして割と最初の方でスタックのダンプ関数用意してます
スタックマシンなんで内部表現がスタックの構成割合が多いんですね
スタックをダンプする事が重要なのではなく
内部表現の見える化が重要なんでしょうね

内部表現は割と解決されている。と思うかもしれませんが
僕がちょこちょこ写経/書写してるホワイトスペースという簡単言語は
結構、色々な言語バージョン(CとかRubyとかPythonとか)
で書かれてるバージョンがあるんですけど
それぞれによって内部表現違うんですよね
言語それぞれに解法は一つとも違って
RubyでPython風にも書けるでしょうし、RubyでC風にも書けるっぽいです
逆にCでRuby風とかは辛いっぽそうでしょうけど
字句解析に正規表現使ってたりしますから
まあ、結構、作者の考え方によって
内部表現の表現に仕方って分かれるんじゃないのかな?って思います

書籍も色々あって
こうウォーターフォールじゃなく
アジャイルに発展を繰り返しながら発展していく書籍も結構あるんですけど
それでも考え方は一緒で
字句解析の発展→構文解析の発展→内部処理の発展
と進みます
なんていうか
そっちの方が説明し易いからそう書いているだけで
作者は割と同時進行で考えている気がします
でもそれも
内部処理の変更を把握しないと構文解析の変更を把握出来ないでしょうし
構文解析の変更を把握しないと字句解析の変更を把握出来ないと思うんです
同時進行でやる人も多いかもしれませんが

自分は、yaccとかも駆使してコーディングしたい気もありますが
やっぱいきなりyacc駆使は無理なんかなーみたいな
手で小型構文解析を繰り返して慣れてきてからっぽいっすね

後、言語処理系作りたくてもやっぱりプログラミングスキルも必要なのかな?と
才能じゃなく(それも重要なんですがw)作業量も必要っぽいっす
いわゆる一万時間の学習的な
自分は一万時間目指して写経/書写頑張って4年くらい経ち
15万行くらいっすw 一時間に100行(150行くらいやれる気もしますがw)
だとすると1500時間っすね。プログラミングそのものとか
書籍読んだ時間とももあるから純粋にそうじゃないけど
才能が無い事を嘆く前に学習量を積めって自分に言ってるごとしでした

強くてニューゲーム(ひょっとしてブレークスルーしたかも)

一昨日、久しぶりにwhitespaceという簡易言語を写経してたら
えたーなってたまんまのHSPへの移植が進みました
ひょっとして俺、ブレークスルーしたかもって調子こいてます
今回こそは上手くいくかもwww

なんか写経も一日100行くらいなのに
まあ昨日も100行くらいなんですがw
一昨日は300行くらいやったしw

なんか最近、カリスマブロガーマナブ様のYOUTUBEにはまってて
それ見てたら、なんだか、人生、上手くいくような気がしてきて
そっから派生したブレークスルー疑惑でしたw

whitespaceのHSPへの移植も、これこそ強くてニューゲームっすよw

強くてニューゲーム(VIMとかFFAとか)

自分の写経用のエディタはVIMなんですが

理由は分割時、別々のファイルを開けるし
移動が自由自在なとこです
画面を半画面づつ動かせるのと
一行づつ動かせるのが好きです
(カーソル行じゃないですよ)

そして、最近、チュートリアルをやってみたら
前よりしっくり来ました
コレがたぶんあれです
カリスマブロガー。マナブ様の言う
強くてニューゲームです

チュートリアルの学習は期間を開けて三回目くらいなんですが
そのたび、強くてニューゲームになってきますねw

そこのあなたも
以前、挑戦してみた事に挑戦してみてはどうですか?
強くてニューゲームになるかもしれませんよ

そして、今日、HSPのプロコンの放送を見てて
ずっと見るのも飽きるんでFFAをやってて
なんとはなしに、ソースコードをDLして覗いてみたんですよ
ほぼメインCGIに記述してて2000行くらいw
あんな有名ゲームが2000行くらいですって
という訳でFFAの写経がTODOに追加されました
これも強くてニューゲームっすなwww

昔はPerlとか全然読めなかったんですけど
今、読んだら昔より理解出来る気がする
強くてニューゲームw

オレオレ小型言語 NO001 演算子案

[iscript]
var opr_s = %[];
opr_s.set_ID = 1111;
opr_s.set_opr = 1112;
opr_s.push_p1 = 1113;
opr_s.push_p2 = 1114;
opr_s.calc = 1121;
opr_s.add = 1211;
opr_s.sub = 1212;
opr_s.mul = 1213;
opr_s.div = 1214;
opr_s.mod = 1215;
opr_s.join = 1216;
opr_s.add_set = 1221;
opr_s.sub_set = 1222;
opr_s.mul_set = 1223;
opr_s.div_set = 1224;
opr_s.mod_set = 1225;
opr_s.join_set= 1226;
opr_s.pp = 1411;
opr_s.ppp = 1412;
opr_s.mm = 1413;
opr_s.mmm = 1414;
opr_s.minus= 1415;
opr_s.plus = 1416;
opr_s.eq = 1511;
opr_s.neq = 1512;
opr_s.lt = 1521;
opr_s.le = 1522;
opr_s.gt = 1523;
opr_s.ge = 1524;
opr_s.not = 1611;
opr_s.and = 1612;
opr_s.or = 1613;
opr_s.xor = 1614;
opr_s.b_not = 1621;
opr_s.b_and = 1622;
opr_s.b_or = 1623;
opr_s.b_xor = 1624;

var opr = %[];
opr[“set_ID”] = 1111;
opr[“set_opr”] = 1112;
opr[“push_p1”] = 1113;
opr[“push_p2”] = 1114;
opr[“calc”]= 1121;
opr[“!+”] = 1211;
opr[“!-“] = 1212;
opr[“!*”] = 1213;
opr[“!/”] = 1214;
opr[“!//”] = 1215;
opr[“!&/”] = 1216;
opr[“!+=”] = 1221;
opr[“!-=”] = 1222;
opr[“!*=”] = 1223;
opr[“!/=”] = 1224;
opr[“!/==”]= 1225;
opr[“!&/=”]= 1226;
opr[“!++”] = 1411;
opr[“!+++”]= 1412;
opr[“!–“] = 1413;
opr[“!—“]= 1414;
opr[“!-/”] = 1415;
opr[“!+/”] = 1416;
opr[“!==”] = 1511;
opr[“!!=”] = 1512;
opr[“!<"] = 1521;
opr[“!<="] = 1522;
opr[“!>”] = 1523;
opr[“!>=”] = 1524;
opr[“!!”] = 1611;
opr[“!&&/”]= 1612;
opr[“!||”] = 1613;
opr[“!^”] = 1614;
opr[“!!b”] = 1621;
opr[“!&&/b”]= 1622;
opr[“!||b”] = 1623;
opr[“!^b”] = 1624;
[endscript]
[s]

吉里吉里に定数はないので、
演算子を定数として扱うこと前提で、
ハッシュに入れてみました。

演算子は!から始めます。
そうすることによって、
演算子以外で制御文字の
選択肢が広がりますって
あんまり広がらないようなw

命令等を&から始まるような仕様なので、
and命令は/で閉めてます。
単項マイナス、単項プラスは
addとmainusの演算子と別にしてます。
前置インクリメントと後置インクリメントも、
別演算子にしています。
ビットor演算等には制御文字ではない、
bという文字を含んでみました。

計算演算子では、数値演算と、実数演算を、
別にした方がいいかは考え中です。

演算の種類とか数は、決定してないので、
数値を富豪的に使ってます。
どうせ吉里吉里はlong long intしかないしw

サクッと吉里吉里講座 NO.011 基本の要素② コマンド文③

>>吉里吉里の基本要素は
>>文字列記述、コマンド文、変数表示emb文、プログラムeval文
>>TJS文iscript~endscript文の5つです

>コマンド文は
>HSPやプログラミング言語の命令のようなものです

>吉里吉里(KAG)コマンドは大きく分けて

  • ①改行改ページ等表示制御、文字制御、等
  • ②選択肢、ジャンプ、等
  • ③画像表示、音楽制御、等
  • ④画面効果、等
  • ⑤マクロ、等

>の5種類があると思っています

今回は画像表示、音楽制御、等
に関してざっくり書きます
そして、今後、少し掘り下げる予定です。

③はざっくりこんな処理です
>「吉里吉里/KAGノベルゲーム制作入門」を
>参照しました。まんま書き写すのもアレなんで、
>微妙に表現を変えています。
>変な違和感があると思いますw

  • 背景層
  • 前景層
  • メッセージ層
  • 表画面
  • 裏画面
  • 重ね合わせの順番
  • 画像読み込み
  • 画像表示
  • 層のデータをコピー
  • 層の数のチェンジ
  • 層の属性のチェンジ
  • 層のオートの移動
  • 音楽の準備作業
  • 効果音の準備作業
  • 音楽の再生
  • 効果音の再生
  • 音楽の停止
  • 効果音の停止

サクッと吉里吉里講座 NO.010 基本の要素② コマンド文②

>>吉里吉里の基本要素は
>>文字列記述、コマンド文、変数表示emb文、プログラムeval文
>>TJS文iscript~endscript文の5つです

>コマンド文は
>HSPやプログラミング言語の命令のようなものです

>吉里吉里(KAG)コマンドは大きく分けて

  • ①改行改ページ等表示制御、文字制御、等
  • ②選択肢、ジャンプ、等
  • ③画像表示、音楽制御、等
  • ④画面効果、等
  • ⑤マクロ、等

>の5種類があると思っています

今回は②選択肢、ジャンプ、等
に関してざっくり書きます
そして、今後、少し掘り下げる予定です。

②はざっくりこんな処理です
「吉里吉里/KAGノベルゲーム制作入門」を
参照しました。まんま書き写すのもアレなんで、
微妙に表現を変えています。
変な違和感があると思いますw

  • 選択肢
  • JUMP
  • ハイパーLINK
  • グラフィカルBUTTON
  • scenarioの分割
  • サブルーチン
  • SAVE
  • LOAD
  • しおり
  • LOAD可ラベル

サクッと吉里吉里講座 NO.009 基本の要素② コマンド文①

>>吉里吉里の基本要素は
> >文字列記述、コマンド文、変数表示emb文、プログラムeval文
>>TJS文iscript~endscript文の5つです

>コマンド文は
>HSPやプログラミング言語の命令のようなものです

>吉里吉里(KAG)コマンドは大きく分けて

  • ①改行改ページ等表示制御、文字制御、等-
  • ②選択肢、ジャンプ、等
  • ③画像表示、音楽制御、等
  • ④画面効果、等
  • ⑤マクロ、等

>の5種類があると思っています

今回は①改行改ページ等表示制御、文字制御、等
に関してざっくり書きます
そして、今後、少し掘り下げる予定です。

①はざっくりこんな処理です
「吉里吉里/KAGノベルゲーム制作入門」を
参照しました。まんま書き写すのもアレなんで、
微妙に表現を変えています。
変な違和感があると思いますw

  • 改行
  • クリック待ち
  • 改ページ待ち
  • メッセージ消去
  • メッセージ消去B
  • フォントチェンジ
  • スタイルチェンジ
  • 文章表示スピードチェンジ
  • 縦書き表示
  • インデント
  • ルビ
  • インライン画像
  • 文字表示座標チェンジ
  • メッセージ層切り替え
  • メッセージ層属性チェンジ

サクッと吉里吉里講座 NO.008 基本の要素② コマンド文概略

>吉里吉里の基本要素は
>文字列記述、コマンド文、変数表示emb文、プログラムeval文
>TJS文iscript~endscript文の5つです

コマンド文は
HSPやプログラミング言語の命令のようなもので
プログラミング言語が命令を特に括らなく
printf文とかで出力するのが
ちょっとめんどくさいのに対し
吉里吉里では
文字列記述が基本記述で
特に括らないで記述するとその文字列を表示します
代わりにコマンド文をカギ括弧で括る決まりです
TJS文をiscript~endscript文で挟むと
この現象は逆転し、TJS文の文法で記述する
プログラミング言語となります
自分はTJSから吉里吉里の命令の呼び出し方が
よくわかってないので
TJSコマンドと吉里吉里(KAG)コマンドを
混ぜて使用したい時はiscript~endscript文で挟まず
めんどくさいですけどevalコマンドでTJSコマンドを
実行していくものと理解しています

吉里吉里(KAG)コマンドは大きく分けて

①改行改ページ等表示制御、文字制御、等

②選択肢、ジャンプ、等

③画像表示、音楽制御、等

④画面効果、等

⑤マクロ、等

の5種類があると思っています

サクッと吉里吉里講座 NO.007 基本の要素①D embコマンド

>吉里吉里の基本要素は
>文字列記述、コマンド文、変数表示emb文、プログラムeval文
>TJS文iscript~endscript文の5つです

>文字列記述には通常とコメント文とラベル文等があり
>emb文もここのくくりです
>emb文は文字列の間で(間でとは限らないんですが)
>変数を表示します

今回は文字列記述。そのD。embコマンド
についてサクッとまとめてみます

>・変数表示emb文
>>embタグは文字列の間で(間でとは限らないんですが)
>>変数を表示します

;例
;数値表示TEST
[eval exp=”f.a = 21″]
現在は[emb exp=f.a]世紀です[r]
;実数表示TEST
[eval exp=”f.b = 3.14″]
円周率は約[emb exp=f.b]です[r]
;文字列表示TEST
[eval exp=”f.c = ‘高畑'”]
私は[emb exp=f.c]と申します
[s]

evalコマンドは1行のTJS式を実行するコマンドです
ここでは変数に値を代入しています
fはハッシュなので宣言とかせずに
ハッシュに値を入れちゃって大丈夫です
数値じゃなく文字列を代入する時は
シングルクォートとかで括る決まりです

サクッと吉里吉里講座 NO.006 基本の要素①C ラベル

>吉里吉里の基本要素は
>文字列記述、コマンド文、変数表示emb文、プログラムeval文
>TJS文iscript~endscript文の5つです

>文字列記述には通常とコメント文とラベル文等があり
>emb文もここのくくりです
>emb文は文字列の間で(間でとは限らないんですが)
>変数を表示します

今回は文字列記述。そのC。ラベル
についてサクッとまとめてみます
(色々例外があってサクッてならなくて申し訳ない)

>・ラベル文
>文字列制御には選択肢やジャンプとかもあって
>文字列を書くような場所に
>(半角アスタリスク)sel_A
>とかのラベルを書いたりもします
>(半角アスタリスク)で始まる文字列
>いやいや、これは半角英数字ではないとは
>書籍に書いてないんですが
>ググったら半角英数字にしておいた方が無難だそうです
>という訳で選択肢やジャンプ文で飛びたい場所がラベルです
>なお(半角アスタリスク)の前に半角スペースとかを置いてはいけません
>僕が初めて吉里吉里をやった時は
>スクリプトをコピペしただけなんですが
>(半角アスタリスク)の前に半角スペースがあって
>謎のエラーでした(そういう仕様だと思ってないので)

AA[r]
BB[r]
[jump target=*EE]
CC[r]
DD[r]
*EE
FF[r]
GG[r]
[s]

タグjumpはgotoのようにtargetで指定したラベルへジャンプします。
タグ[r]は改行のタグです。
タグ[s]は動作の停止です。

・栞
吉里吉里は簡単にゲームデータをセーブ/ロード出来ます
特に設定しなければ、PLAY画面の上部のメニューに
「栞をたどる」「栞をはさむ」という項目があり
「栞をはさむ」→「日時 見出し」の一覧(空欄もあり)
から選ぶとデータをセーブします
「栞をたどる」→「日時 見出し」の一覧(空欄もあり)
から選ぶとデータをロードします
Config.tjsの「// ◆ 保存モード」を変更すると簡単な暗号がかかります
「// ◆ 利用可能な栞の数」を変更すると栞の数が変更出来ます
コピペしてConfig.tjsを検索すると楽かも

・セーブ可能なラベル(見出し)
(半角アスタリスク)sel_B(半角or)|場所B
とかラベルの後ろに|記号を置いて、次の文字列をおくと
セーブ可能なラベルとなります
見出しって書いてます
文字列は日本語で構わないと思います
サンプルも日本語が多いようです
そこに着いてちょいした時とか(次のセーブ可ラベルに着いてない時)
そこに着いた時のデータを保存します
ラベル(半角アスタリスク)sel_B(半角or)|の
後ろの文字列は重複したり、無くても問題ないそうです
変数を置いてもいいそうですが
同じ変数を置くとバグの基になるかもだそうです
重複するラベルには特別なルールがあるそうです
見出しラベルはラベルを省略してもいいそうです
(半角アスタリスク)はつけてくださいね
見出しの省略、重複。ラベルの省略、重複は、
作品のバージョンが上がったりして
そのスクリプトが違う動きをした時の
交換性に問題があるそうなので、自己責任で

AA[r][l]
BB[r]
;通常の見出しラベル
*CC|いろ
DD[r][l]
EE[r]
;通常の見出しラベル
*DD|はに
FF[r][l]
GG[r]
;見出し重複ラベル
*HH|はに
II[r][l]
JJ[r]
;見出し省略ラベル
*KK|
LL[r][l]
MM[r]
;ラベル省略ラベル
*|ほへ
NN[r][l]
OO[r]

;ラベルと見出し省略ラベル
*|
PP[r][l]
[s]

重複したラベルは

;一つ目
*ABC
;二つ目
*ABC:2
;三つ目
*ABC:3

のようになるそうです
ラベルを省略すると
重複したラベルを設定することと同じになるそうです