トップページ⇒tech
86コメント33KB

スクリプト言語の作成

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。NGNG
ゲームなんかで使うスクリプト言語を自作したいのですが、
なにか参考になるサイトがあったら教えてください。
0002名無しさん@お腹いっぱい。 NGNG
これはアドバイスではなくて、お願いです。
あなたが、あちこち探したのに見つからないというのなら
スクリプト言語の自作はあきらめてください
そうでないと、あなたの検索能力では、なにかあるたびに
他人にきいてまわることになり、迷惑です。
0003名無しさん@お腹いっぱい。NGNG
その前に、ゲームなんかでスクリプト言語を自作する意味と
また、その利点を教えてください。

これ常々疑問なんです。何故こんなものを作るのでしょうか?
バグが増えませんか?
0004名無しさん@お腹いっぱい。NGNG
もうすでにいろいろあるだろう?
聞かなきゃ作れないようなレベルのものはいらない
00051NGNG
>3
Luaとか既存のライブラリを使ってもいいんですが、そういうのってゲーム
に使うにはオーバースペックな気がします。
だったら、勉強もかねて自分で作ってみようかな、と思ったわけです。
0006224NGNG
Perl拡張しろ
0007名無しさん@お腹いっぱい。NGNG
ゲームツクールシリーズでも使えばぁ?
0008名無しさん@お腹いっぱい。NGNG
>5
では、いろいろとここで人気のやねうらおさんの所でも
いってみてください。
http://www.sun-inet.or.jp/~yaneurao/
しかし、6の人の何気ない一言もマトを得ているので、
一から作り出す前によく考えたほうがいいです。
大抵は徒労に終わります。
0009名無しさん@お腹いっぱい。NGNG
まぁ、君たち、まちたまへよ。
1から作ってみることで学べることもあろうよ。
もうすでにあるから作らない、はプロさんだけで十分だわ。
アマが作りたいと思ったもの作ることに対して
逐一足引っ張ってどうするの。
自作結構。いいじゃないか。
もっとのびのびやろうや。
そうは思わんかね( ̄ー ̄)y-o00 マターリ
0010名無しさん@お腹いっぱい。NGNG
>>1
ゲームに特化したスクリプトってのがどんなものか
詳しくは知らんのですが、参考までに。

“flex”や“bison”のキーワードで検索かければ
勉強に役立つ情報はサクサク見つかることでしょう。

>>7
宿題やって寝ろ
00111NGNG
とりあえず単純なスクリプトのパーサーなら作ってみたんですけどね。
こんなやつ(笑)

--------------------------
START:
 goto(TEST1)
 end

TEST1:
 print("逝ってよし")
 end
---------------------------

ただ四則演算なんかはどう実装するのかな、と気になったもんで。
どっちみちゲームで使うだけなのでそれほどたいそうな機能は必要無いです。
0012名無しのエリーNGNG
>>11
君の作るゲームのレベルが容易に想像つくよ(w
0013名無しさん@お腹いっぱい。NGNG
>>11
ワラタ
0014名無しさん@お腹いっぱい。NGNG
>>11
言語処理のアルゴリズムは深く研究されてる分野だから、
本やネットで公開されてる情報で勉強したほうがいいよ。
四則演算の処理で悩んで、こんなところで質問してるより
一週間くらいかけて、コンパイラ関係の本でも読んでください。
そっちのほうが近道です。
0015名無しさん@お腹いっぱい。NGNG
もうみんないじわるだなぁ:-):-)。

http://www.tokumaru.org/ -> インタプリタのソースなど
http://duff.kuicr.kyoto-u.ac.jp/~jargon/ -> bison@`flexのマニュアル日本語訳など

あとこれは入手が難しいけど一応。
http://www.context.co.jp/~cond/books/#c_compiler_with_yacc -> おすすめ!
0016名無しさん@お腹いっぱい。NGNG
BASIC(Visualではない方)やバッチファイルの書式だけでも参考になると思うぞ。
シェルなどでもいいけど。
0017名無しさん@お腹いっぱい。NGNG
四則演算は「逆ポーランド記法」を覚えなければ話にもならない。
ちょっとずつでも結構難しいと思うよ。言語処理って。
基本でこれだもんなぁ。
1の人はこんな難しいのやるより他にたくさん覚えなければ
ならないこと(基礎)が有ると思う。
0018名無しさん@お腹いっぱい。NGNG
まだ逆ポーランドとかいってる奴がいるのか...
佐伯港かが炊こう文化遺跡でやれ。
0019名無しさん@お腹いっぱい。NGNG
>>17
本格的なコンパイラ作ろうってわけじゃないんだから、そんなに大変じゃないだろ。
オレは昔、コンパイラの本に載ってたサンプルプログラムを
改造してゲーム用のスクリプト言語を作ったけど、1〜2週間くらいでできたぞ。
00201NGNG
>>12-13
それはどうも(^^;

>>14
やっぱ本読んだほうがいいですかねぇ。
とりあえず図書館に逝ってきます。

>>15
有用なページをありがとうございます。ローカルに落としてじっくり読みます。

>>19
頑張ります。
0021名無しさん@お腹いっぱい。NGNG
>>18
学校はサボらないほうがいい
指摘にすらなってない
0022名無しさん@お腹いっぱい。NGNG
>>17
言語処理系はソフトウェア科学の基礎だよ。
この場合の基礎はBasicじゃなくFundamentalって意味だ。
でも、地味だからパソコン少年を引き付けるネタとしては弱いんだよね。
0023名無しさん@お腹いっぱい。NGNG
Compiler Construction の授業
 http://rananim.ie.u-ryukyu.ac.jp/~kono/lecture/old.html

再帰下降構文解析の手法 -> たいへんシンプルな説明でよいと思う
 http://member.nifty.ne.jp/nakamula/recurs.htm
0024名無しさん@お腹いっぱい。NGNG
おすすめの本。ドラゴンブックより薄くてコードの例も多いので、
とっつきやすい。オブジェクト指向言語とか最近のトピックも網羅
してます。

http://www.cs.princeton.edu/~appel/modern/
00251NGNG
とりあえず文字列をトークンに分解するところまではなんとかできました。
これだけでも真面目にやろうとすると結構大変ですね。って俺がヘタレなだけか(;´Д`)

>>23-24
ありがとうございます。
とくに
http://member.nifty.ne.jp/nakamula/recurs.htm
はマジで助かります。
0026名前NGNG
スクリプト言語ってなに?自分で勝手に作った文法と命令を解釈するプログラム用の自作言語ってこと?
0027名無しさん@お腹いっぱい。NGNG
煽り?>26
0028名無しさん@お腹いっぱい。NGNG
スクリプトは一行単位に文法を解釈(機械語に変換)、実行するプログラムのこと(でいいよな?)
スクリプト言語にはBASIC やシェルなどがある(Perlも一応含まれる)。
Cのようにソースを実行前に全て機械語に変換する「コンパイル」と比較に出されることもある。
言うまでもなく一括コンパイルした方が速いがいじりやすさなどではスクリプトの方がいいかな。
自作言語は自作言語。スクリプトとは違う。
0029名無しさん@お腹いっぱい。NGNG
BASICはスクリプト言語なのか?
インタプリタとごっちゃになっておらんか?
それにフツー機械語に変換はしないぞ‥まあこれは実装によるか‥
003028NGNG
あ、ごめーん思いっきり混同してた。逝ってくらあ。
0031名無しさん@お腹いっぱい。NGNG
>>28
>スクリプトは一行単位に文法を解釈

一行単位?違うと思う。
0032名無しさんNGNG
>>28
シェルスクリプトは一行単位だろうけど、
Perlは内部表現にコンパイルしてからインタプリタで実行する。
Javaでいうとclassファイルをメモリ上で作成してそのまま実行といった感じだ。
#内部表現は木構造などで、バイトコードまでは作らないが
この方法だと、実行前に静的なエラーをチェックできるし、
内部表現を上手く作ればある程度の最適化が望める。

スクリプト言語自体意味が曖昧だが、、、
一行一個のコマンドを上から下へ順番に実行するだけの言語
だったらスクリプト言語と言えるだろうね。

>>31
構文解析の時点では普通字句単位だな。
00331NGNG
ようやく足し算と引き算ができるようになりました。(;´Д`)ヒー

それにしても、再帰下降法ってバグの温床になりませんか?
ヘタするとすぐに無限ループに陥いってスタックはじけて逝きます。
0034>33NGNG
うんそうだねぇ 慣れればなんとかなるけど、慣れるまではそうだね
0035名無しさん@お腹いっぱい。NGNG
>>33
条件分岐の実装とかどーゆーふーにするの?興味あり。
0036名無しさん@お腹いっぱい。NGNG
EBNFとかちゃんと書いてるのか?
00371NGNG
乗算と除算、括弧の処理を実装して、
なんとか四則演算がまともにできるようになりました。
とりあえず第一の目標は達成かな。

>35
条件分岐やループのことは考えてませんでした(^^;
のたうちまわりながら考えます。

>36
EBNFってなんですか?
0038名無しさん@お腹いっぱい。NGNG
ちょっと前にアドベンチャーゲームの作り方をまるまる1冊で
解説した本が出てた。
c++でシンプルなスクリプト言語を作っている。

タイトルは忘れてしまったが、買うのをためらってしまいそうな
…な表紙が目印だ。
0039名無しさん@お腹いっぱい。NGNG
YACCとか使わないの?
0040名無しさん@お腹いっぱい。NGNG
シューティングゲームでどの敵キャラがどのタイミングで
どういう軌跡を描いてどういう弾を出しながら出現するか、とかを
柔軟に書く為にはどうしてもスクリプトがあった方が便利ですよね。
シミュレーションRPGで敵キャラクターの動きを設定したり。
まあ、パラメーター設定が多かったりするんですが。

行動と条件をあらかじめ定義すれば、かなり柔軟になります。

エイジオブエンパイア2コンカーはコンピューターの行動パターンスクリプトと
マップ生成スクリプトをユーザーが書けるのですが、
とても面白いですよ。勉強にもなります。
ttp://web1.omn.ne.jp/~cat/index.html
ttp://www02.u-page.so-net.ne.jp/gc4/takahisa/aoe/rmsr.htm

何かの参考になれば…。
0041名無しさん@お腹いっぱい。NGNG
ADD(a@`b@`c)
→a=b+c;
じゃいけないの?
0042名無しさん@お腹いっぱい。NGNG
>>37
if文 ::= if (式) 文 | if (式) 文 else 文
みたいなのをBNFという。
再帰下降の場合はこれにそって関数を呼び出していくだけでいい。
if文を解釈する関数内では。
字句"if"、字句"("が順に出現しているかを確かめ、
式を解釈する関数を呼び出し、字句")"の出現を確かめ・・・となる。
0043名無しさん@お腹いっぱい。NGNG
yacc/lex が楽だぞん
BNF ゴリ押しは限界が早くくるるん
0044名無しさん@お腹いっぱい。NGNG
>>43
yacc使うにしても結局BNFで文法を定義しないか?
しかしNUTSHELLシリーズのlex&yaccくらいしか参考書がないのが辛い。
0045名無しさん@お腹いっぱい。NGNG
出来るようになったらその余力でフリーのXMLパーサでも
作ってくれ。
0046名無しさん@お腹いっぱい。NGNG
>>38
確かにためらう・・・
http://books-domino.pub.softbank.co.jp/bookweb.nsf/7218069992c69510492566350001471a/352dfe5b3f2ea1ad4925682c002cd876?OpenDocument
0047名無しさん@お腹いっぱい。NGNG
>>45
XMLファイルを読むだけなら、どーってこ事ないけど、validationが
大変よん。
0048名無しさん@お腹いっぱい。NGNG
gnome で使ってる libxml とかはどうなん?
00491NGNG
こんどはifとelseの条件分岐を実装しました。
switch-caseとかloop処理はどうしたもんかな。

>>40
ありがとうございます。AOKはよくしらないのですが、参考になります。

>>42
なるほど、そういうことでしたか。
だいたいそんな感じで実装してます。

>>45
それではそのうちに(^^;
00501NGNG
自分は今、RPGっぽいゲームを作ってるんですが、
RPGに適したスクリプトってどんなのでしょうか?
あるいは実際のRPGではどんなスクリプトが使用されてるんでしょうか?

やっぱりイベントドリブン型で作ったほうがいいですよね?
0051名無しさん@お腹いっぱい。NGNG
>>45
libxml http://www.xmlsoft.org/
 GNOME向けのXMLライブラリだが、GNOME環境下でないと使えないわけではない。
expat http://www.jclark.com/xml/expat.html
 これはnon-validation。PerlやRubyのXMLライブラリはこれへのラッパ。
XML for C++ http://www.alphaworks.ibm.com/tech/xml4c
 ApacheのXercesベース
XML Parser for Java http://www.alphaworks.ibm.com/tech/xml4j
 同上

手軽さならexpat、JavaならXML4Jかな。libxmlは使ったことはないが、
サンプルプログラムのhtmllintなんかはちゃんと働いていた。
0052>50NGNG
今だとそれこそXMLスタイル内にスクリプトを組み込んで作るといいかもしれないね。
マップからキャラクタからシナリオから全部をまとめて表現出来る
0053名無しさん@お腹いっぱい。NGNG
>>52
風林火山の厳島/月山がそうだな。 http://www.wffm.org/

ゲームプログラミング相談室スレでも話に出ているように、
どこまでをスクリプトに任せるかが重要。
0054?NGNG
>>52
?????????
??????????expat???????????????????

?????expat??????????????
<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>
???????Unknown Encoding???????????

?????text encoding???????????????????????
00551NGNG
すびばせん、化けました。

>>52
それは名案ですね。
おもしろそうなんでexpatを落としてきていろいろ遊んでいます。

ところでexpatって日本語扱えるんですか?
<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>
とかやっても、Unknown encodingっていわれます。

それともtext encodingは自分で処理する必要があるんですか?
0056名無しさん@お腹いっぱい。NGNG
http://www.inac.co.jp/~maki/xml/expat.html
0057名無しさん@お腹いっぱい。NGNG
>>55
UTF-8じゃダメ〜?
00581NGNG
>>56
expat-jpを試してみたんですけど、なぜか文字化けしてしまいます。
prologにShift_JISと書いておくだけではダメなんでしょうか?

>>57
そうすると、内部データはUTF-8で持っていて、表示するときにSHIFT-JISに変換するという事になりますよね? めんどくさいけどこれが一番かな。

それとも、自分で日本語OKなXMLのパーサを書いてみようかな。
validation無しならなんとかなりそうだし。
00591NGNG
正直な話、XMLのパーサを作るのってどれくらいの手間なんでしょう?
作った事のある人がいれば教えて欲しいです。
やっぱり1から作るのは大変ですか?
0060名無しさん@お腹いっぱい。NGNG
>>59
パースすること自体は、XMLの構造が単純だからそれほど難しくない。
パースして取り出したデータへのアクセス方法
(いわゆるSAXやDOM)の実装がやや面倒。
ま、上から順にアクセスするだけなら楽だね。
00611NGNG
やっとこさexpatで日本語が扱えるようになりました。あーつかれた(;´Д`)

コンソールに表示する前にテキストをShift_JISに変換することで解決しました。
どうやらexpat内部では、UTF-8でテキストのデータを持っていて、
WinやMacのコンソールではShift_JISにしか対応していないにもかかわらず、
UTF-8のテキストをそのままコンソールに渡していたために文字化けしてしまったようです。

バカだなぁ、俺って・・・

>>60
ありがとうございます。
そうですか、けっこう面倒そうですね。やっぱ自作はやめておこうかな(^^;
0062名無しさん@お腹いっぱい。NGNG
XMLの構文を拡張しないでタグのみでスクリプト作ってみようかと思っているこの頃
0063名無しさん@お腹いっぱい。NGNG
たしかW3Cの規格ではサポート必須なのはUTF-8だけで他の文字コード
はオプション扱いだったと思います。

パーサが外人の場合はUTF-8しかまともに動かないんではないかと思う。
ちゅーか、日本製のパーサってあるんかい?
0064名無しさん@お腹いっぱい。NGNG
XMLのパースなんてOOPでCompositeパターン使えば
そのまんまな気がするけど。。。
0065名無しさん@お腹いっぱい。NGNG
>>63
たしかJavaで作られたパーサで日本製のがあったと思います。
SHIFT-JIS@` JIS@` EUC-JPが通るやつ。

どこにあったかは失念。
0066名無しさん@お腹いっぱい。NGNG
>>62
スクリプト書くのが面倒そう。面白そうではあるが。
0067名無しさん@お腹いっぱい。NGNG
>>63@` 65
検索しろって。

XML Parser for Java
http://www.alphaworks.ibm.com/tech/xml4j
説明は英語だけどな。

Java と XML 使うんなら、その手のサイト情報は押さえてとけって。
損しないから。
0068コンパクトな言語NGNG
少し違う話題なのですが,似た内容なので便乗させてもらいます。すいません。

僕も1さんと同じような状況でスクリプト言語の導入を考えているのですが,
スクリプト言語の作成自体にはあまり興味が無いので,既存のライブラリを
利用しようと考えてます。

GNUのGUILEのような著名なものをいくつか試してみたのですが,どれもいまいち
規模が大げさすぎて,気軽に組み込むには抵抗のあるものでした。どなたか
コンパクトで組み込み用途に特化されたライブラリをご存知でしたら,教えて
いただきたいのですが・・・。

ちなみに,今はこれ↓の導入を考えています。非常にコンパクトなschemeの処理系です。
http://tinyscheme.sourceforge.net/home.html
0069名無しさん@お腹いっぱい。NGNG
>68
Tclインタプリタはどうです?

 http://dev.ajubasolutions.com/software/tcltk/8.3.html -- ここでダウンロードできるよ
 http://www.geocities.co.jp/SiliconValley/4137/shiba.html -- リンクがたくさん(日本語)
 http://members.nbci.com/tcltk/index.html -- Cから利用するための親切な情報がある(日本語)
0070名無しさん@お腹いっぱい。NGNG
組み込み用途ならC(Cで書いてるなら)にコンバートしちゃえば
いいじゃん。
007169NGNG
…って上に書いたら、Tcl/Tkのスレがいつのまにかあがっとった...

 http://piza.2ch.net/test/read.cgi?bbs=tech&key=966300886
00721NGNG
expatは、指定したコールバックを呼び出してくれるだけなので、expatをC++の
クラスで包んで、DOMっぽく実装してみました。これでなんとか使えるかな。

それにしても、JAVAではずいぶんとXMLパーサが充実してますね。
CでProject Xに匹敵するくらいのパーサってあるんでしょうか。
0073名無しさん@お腹いっぱい。NGNG
もぢらで使ってるexpatってDTDのvalidationもしてくれる
特別バージョンみたいだね。
0074名無しさん@お腹いっぱい。NGNG
>>72
Xerces for C じゃだめ?
00751NGNG
>>74
ありがとうございます。
http://xml.apache.org/xerces-c/
これですね。

でも、やっぱり手軽さではexpatが勝ちですね。
どうも自分はいまいちexpatの使い方がわからんのですが、
expatのサンプルなんかを置いているサイトってないですか。
ってGecko見ればいいのか(汗
0076名無しさん@お腹いっぱい。NGNG
>Xerces for C
C言語じゃなくてC++じゃん…
看板に偽りアリ!
0077処理系の実装の質によるがNGNG
>>76
>C言語じゃなくてC++じゃん…

こういうライブラリはまだCの方が環境に依存しなくて良いかもね。
作りによってはメンテが大変だけど…
00781NGNG
52さんのアイデアであったように、
とりあえずXMLのスタイル内にスクリプトを記述する事にします。
だいたいこんな感じ。
------------------------------------------------------------
<SCRIPT>
 <START>
  print("逝ってよし");
  goto OMAEMONA;
 </START>

 <OMAEMONA>
  print("オマエモナー");
 </OMAEMONA>
</SCRIPT>
------------------------------------------------------------
スクリプトはやねうらおさんのyaneScriptのソースを参考にして
やっています。
0079名無しさん@お腹いっぱい。NGNG
>>78
少なくともこのくらいにしないとXMLぽくないなあ。
ラベルがstartのシーン要素から開始し、endのシーン要素で終了。
read要素はシーンの呼び出しね。
<script>
 <scene label="start">
  <print>逝ってよし</print>
<read label="OMAEMONA"/>
 </scene>
 <scene label="end">
  <print>オレモナー</print>
 </scene>
 <scene label="OMAEMONA">
  <print>オマエモナー</print>
 </scene>
</script>
0080名無しさん@お腹いっぱい。NGNG
そうだなあ、じゃ if 文も 同じ調子で
<もしもだよ label="COMP1"> &lt;!---COM1の結果により ---&gt;
 <ならば> なんとか </>
 <でなければ> かんとか</>
</>
0081名無しさん@お腹いっぱい。NGNG
いやXMLらしらを追いかけてゆくなら既にあるものを利用しよう
http://member.nifty.ne.jp/y-sato/wffm/docs/pages/g3-gs-01.html

もちろん自分で色々工夫するのは悪い事じゃない
00821NGNG
>>79-81
 なーる。XMLのタグを使って記述するんですか。そういうのも面白そうですね。
コマンド型インタプリタとどっちがいいんだろう、、、悩むなぁ。
0083名無しさん@お腹いっぱい。NGNG
まだ作ってる?
0084名無しさん@お腹いっぱい。NGNG
やってますとも(^^;
仕様でかなり悩んでるのであんまり進んでませんけど。
0085名無しさん@お腹いっぱい。NGNG
初心者なんでc言語の事、よく解ってないけど
HSPは参考になるかな?

http://www.onionsoft.net/
0086名無しさん@お腹いっぱい。NGNG
age
■ このスレッドは過去ログ倉庫に格納されています