『コンパイラ・スクリプトエンジン』 相談室 2
■ このスレッドは過去ログ倉庫に格納されています
0001nanashi de fault
NGNG>yaccやlexの使い方やら言語仕様やらの話題。
前スレ
【コンパイラ・スクリプトエンジン】相談室
http://pc.2ch.net/test/read.cgi/tech/981672957/
前スレアーカイブ(かちゅ用)
http://www.1me.jp/hp/prg_c-s_lab
前スレに張られたリンク + x
>>2-6
0232デフォルトの名無しさん
NGNGだれそれ?電波固定?
0233デフォルトの名無しさん
NGNG使っているのですが、入力した数値で要素数が定義されてるよう
な場合どうしたらよいでしょうか?
要素数 - 要素...
4 4 4 2 2
5 0 1 0 2 3
2 0 3
という形式です。
int_array
: /* empty */
| integer
| int_array integer
;
では、全部一気に読んでしまうので・・・。(低レベルでスマン・・・。)
0234デフォルトの名無しさん
NGNGint_array
: /* empty */
| one integer
| two integer integer
| three integer integer integer
(略)
;
とするとか…
イヤスギ
0235デフォルトの名無しさん
NGNG| integer
| int_list integer
;
int_array: integer int_list
;
ダメか?
0236棄教者 ◆KIKYO7cg
NGNG%token NUM
%%
lines : /* empty */
| line lines
;
line : index elements '\n' ;
index : number ;
elements : /* empty */
| number elements
;
number : NUM ;
%%
------------------lex-------------
[0-9]+ { yylval = atoi( yytext ); return NUM; }
[ \t] { /* 空白は捨てる */ }
でどうよ。
0237233
NGNG>>234
ちょっと無理です・・・。^^;
>>235
最初の要素は良いのですが残りはすべてint_list integerに一致して
しまうようです。
>>236
233の例では行けると思いますが、実はこの形式を出力するツールは
一つではなくて、それらの間で改行の位置というのは統一されていな
いのです。というわけで、できれば改行フリーでなんとかしたいと
思ってるのですが・・・。
うーん、そもそも読み込んだ値を利用したり、繰り返しの回数を制限
するのはyaccで定義できる構文の概念を逸脱しているんでしょうか・
・・。 今回はyaccの使用はやめてlexだけに留めるべきかもしれませ
んね。(その辺ご存知の方いましたら後学のため教えていただきたい
です。)
0238デフォルトの名無しさん
NGNGatoiでいいじゃん。
「何回繰り返す」とかはセマンティクスの部類に入るから、
yacc使うのはお門違い。
0239デフォルトの名無しさん
NGNGドラゴンブックにはそういうの(個数の検査とか)は構文では解決でけん
と書いてあった気がします。
0240デフォルトの名無しさん
NGNG正攻法は単に数値のリストとして、リストに含まれる文字コードチェックに
利用を限ってしまうのがいいんじゃないかな?
考えてみるのは面白そうだけど、
仕事となると、むきになってやっても費用対効果がなさそうだし・・・
0241デフォルトの名無しさん
NGNGhttp://page.freett.com/gikob/gikob0002.zip
0242241
NGNG0243デフォルトの名無しさん
NGNG0244デフォルトの名無しさん
NGNG0245デフォルトの名無しさん
NGNGこれ http://spirit.sourceforge.net/ どうなん?
0246デフォルトの名無しさん
NGNGすげー。びびった。久々に驚嘆したハックだ。
0247デフォルトの名無しさん
NGNG0248デフォルトの名無しさん
NGNGここから木の様に情報を取り出したいと思ったのですが、上手くパーサを作れません。
tokenizerは簡単に出来るのですが、どうすれば良いですか。rubyでやってます。
object hoge
caption='hogehoge'
val=0
object fuga
caption='fugafuga'
object aaa
caption='aaa'
end
object bbb
caption='bbb'
end
object ccc
caption='ccc'
end
end
end
0249ねこま
NGNG0250デフォルトの名無しさん
NGNG各ノードは子供と親のリンクを持つ。
<でノードを生成、現在処理中のノードへの参照を
親への参照として新規ノードへ設定。
その後で親に子として新規ノードへの参照を設定。
処理中のノードの参照として新規ノードを指させる。
>でシングルタグか開始タグか終了タグかを判断し
親に戻るかどうかを決める。
戻る時には処理中のノードの参照として
親を指させる。
こっちにドキュメントを置いてます。
サンプルソースはC++。
ソース玉は整理してないんで乱雑にメモテキストとか
テストデータが散らかっててちょっと気が引ける。
https://sourceforge.jp/projects/frogger/
こういうドキュメントが欲しいとか
掲示板に投げておけばそのうち対処するかも。
0251デフォルトの名無しさん
NGNGrubyじゃできないな。
0252デフォルトの名無しさん
NGNGloop
token w = Tokenizer.next();
if w == 'object' then
currNode := currNode.pushNewNode( Tokenizer.next());
continue;
end if
if w == 'end' then
currNode := currNode.parent();
if currNode is null then break;
continue;
end if
Tokenizer.skip();
currNode.pushNamedValue( w, Tokenizer.next());
end loop
Node というクラスはツリーのノードを表す。
各ノードは子ノードとして、object か namedValue を持つことができる。
pushNewNode は object 子ノードとして追加して、その新規子ノードを返す。
引数はノードの名前を表す。
pushNamedValue は namedValue 子ノードとして追加する。戻り値はなし。
第一引数は値の名前、第二引数は値の中身。
0253デフォルトの名無しさん
NGNG一週間前にはかけらすらないような事趣味でやり始めて分かったんですが構造を持つ
ファイルフォーマットってコンパイラ作成のような視点が必要なんですね。
さすがにインデントでは無理だってすぐ分かりましたが、xmlに近いことは
気づきませんでした。そう言えばxmlと似てますね。
内部データ構造を持つファイルフォーマットのパーサーの解説の一般的なドキュメント
希望>250
0254デフォルトの名無しさん
NGNG(define (hoge-read s)
(let loop ((x s) (stack '()))
(if (pair? x)
(case (car x)
((object)
(loop (cddr x) (cons (list (cadr x) (car x)) stack)))
((end)
(if (null? stack)
(error "Syntax-error - Corresponding 'object' is required :"
s))
(if (pair? (cdr stack))
(loop (cdr x)
(cons
(cons (reverse (car stack)) (cadr stack))
(cddr stack)))
(loop (cdr x) (reverse (car stack)))))
(else
(loop (cdddr x)
(cons
(cons (list (car x) (caddr x)) (car stack))
(cdr stack)))))
(if (and (pair? stack) (pair? (car stack)))
(error "Syntax-error - 'end' is required :" s)
stack))))
0255デフォルトの名無しさん
NGNG(define hoge-read-test-data '(
object hoge
caption = "hogehoge"
val = 0
object fuga
caption = "fugafuga"
object aaa
caption = "aaa"
end
object bbb
caption = "bbb"
end
object ccc
caption = "ccc"
end
end
end
))
(hoge-read read-tag-test-data)
=>
(object
hoge
(caption "hogehoge")
(val 0)
(object
fuga
(caption "fugafuga")
(object aaa (caption "aaa"))
(object bbb (caption "bbb"))
(object ccc (caption "ccc"))))
0256デフォルトの名無しさん
NGNGscmobj_t hoge_read(scmobj_t s) {
scmobj_t x = s;
scmobj_t stack = nil;
tail_recursive_loop:
if (pairp(x)) {
if (car(x) == make_symbol("object")) {
stack = cons(list2(cadr(x),car(x)),stack);
x = cddr(x);
goto tail_recursive_loop;
} else if (car(x) == make_symbol("end")) {
if (nullp(stack))
return error("Syntax-error - Corresponding 'object' is required :",s);
if (pairp(cdr(stack))) {
x = cdr(x);
stack = cons(cons(reverse(car(stack)),cadr(stack)),cddr(stack));
goto tail_recursive_loop;
} else {
x = cdr(x);
stack = reverse(car(stack));
goto tail_recursive_loop;
}
} else {
stack = cons(cons(list2(car(x),caddr(x)),car(stack)),cdr(stack));
x = cdddr(x);
goto tail_recursive_loop;
}
} else if (pairp(stack) && pairp(car(stack)))
return error("Syntax-error - 'end' is required :",s);
return stack;
}
0257デフォルトの名無しさん
NGNGExpression Templateをはじめ各種のテンプレート・メタ・プログラミングは
知ってたけどPaser Generatorにまで行きつくとは。
カ コ イ イ ! !
テンプレートらしく解析対象の列の要素型がパラメタ指定できるのもカコイイ!
(char, w_charに始まってユーザー作成のクラスまで)
字句解析器も含んでるしね。
当方Java(正確にはバイトコード)のPartial Evaluationを実装中なのだが、
Javaに演算子多重定義が導入されていれば、
合わせ技で同じようなことが狙えたのになァ。惜しい。
(メソッド呼び出し式で書けば良いわけだが、カッコ良さが大いに減る。)
0258デフォルトの名無しさん
NGNGでも、あんまり真剣な用途には使えないよね。
実行時にパーザ生成するんだったら、文字列で文法与えても良いな。
0259祐一ゴン
NGNG中学の時からポカリの粉を麻薬と思って鼻から吸ってたけどヽ(`Д´)ノ ウワァァン!!全然トリップできないや!最近初めてその事実を知ったよ
今部屋をテラフォーミングしたら鼠の干からびた死体が出てきたよ、あまり旨くなかったよ
0260デフォルトの名無しさん
NGNG0261:−)
NGNGベーシック→HSP
HSPはタダの開発環境です。デルフィは10万円くらい?
0262デフォルトの名無しさん
NGNGa(b(c(d())));
ってのをなんらかの中間コードにしてあって、
これを1パスでコード生成できるの?
(最適化はどうでもいい)
a();
のコード生成はできるけど、
a(b());
のようにネストするとできなくなって困ってます。
0263デフォルトの名無しさん
NGNGちょっとは考えろ
つーか、お前の言う中間コードって何のためにあるのさ
0264デフォルトの名無しさん
NGNG> ってのをなんらかの中間コードにしてあって、
> これを1パスでコード生成できるの?
「これ」というのが「中間コード」を指しているのなら、
どのような「中間コード」なのか示してもらわないと。
) を検出したタイミングでコード生成すりゃいいだけの
話なんだけど。
0265デフォルトの名無しさん
NGNG0266デフォルトの名無しさん
NGNGデルファイじゃないのか?Delphi
嘘教えるなよ
0267デフォルトの名無しさん
NGNG0268デフォルトの名無しさん
NGNGいってるんだろ。どっちだろう、俺はベーシック知らないからなんとも
いえん。
0269デフォルトの名無しさん
NGNGインタプリタならBasicの方が楽だろう。
昔のBasicインタプリタは4KBくらいだった。
0270デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNGほれ
ttp://homepage2.nifty.com/rohizuka/ka/pa_003_a.htm
0272デフォルトの名無しさん
NGNG…この21世紀になんでその2択に拘るんだw。
0273257
NGNG使えないかねぇ…。この辺の技術には期待したいトコロなんだけどなぁ。
私も使ってみたわけではないので大丈夫と言い切れるもんではないんだが。
実行時というか、コンパイル時にテンプレートの展開動作を利用して
パーザが作られるようなんだが。
0274デフォルトの名無しさん
NGNGギコBASICは参考にならないですか?
0275デフォルトの名無しさん
NGNGhttp://member.nifty.ne.jp/nakamula/recurs.htm
0276デフォルトの名無しさん
NGNG激しく鬱…
bison++/flex++に乗り換えるかのぉ。ドキュメント少なすぎだが・・・
0277デフォルトの名無しさん
NGNG> bisonが吐き出したコードってなんでVC++でコンパイル通らないんだ?
gcc 使え、というお達しかと……。ところで byacc とか kmyacc はどう?
0278276
NGNGまぁ、別にオブジェクト指向な解析器が作りたいというわけではなく、ただアクション書くのにクラスとか使いたいだけなんだが…
何かいい方法あったらキボンヌ!というか、bison++/flex++の日本語ドキュメントなんか激しくほすぃかも
0279デフォルトの名無しさん
NGNGinclude 外せばいいんじゃないの?
0280デフォルトの名無しさん
NGNGそれだと毎回 *.y からコード生成するたびに書き換えが必要になるから、
ダミーのヘッダファイルをでっち上げるに一票。
っつか、どうしても再入可能にしたいとかで bison の機能が必須でなければ、
bison 以外の yacc 互換処理系を試す方が幸せかも知れんが。
0281278
NGNGbison以外ならC++ソースとしてビルドできるんですか?
今日はbison++/flex++試しマスタ。今度はVC++だとエラー出まくって全然ビルドできない罠。
byaccとkmyacc試してみるかなぁ。
0282デフォルトの名無しさん
NGNG0283bloom
NGNGhttp://www.agemasukudasai.com/bloom/
0284デフォルトの名無しさん
NGNG0285デフォルトの名無しさん
NGNG0286デフォルトの名無しさん
NGNG0287デフォルトの名無しさん
NGNGlex + yacc + RTL(gcc)じゃ駄目か?
0288デフォルトの名無しさん
NGNGまたは本でも。
0289デフォルトの名無しさん
NGNGこのスレ、結構人が訪れているみたいなんだけれど、
実際にコンパイラレベル(変な言い方だけど)のものを作ってる、もしくは作った人っています?
自分はスクリプトぐらいなら、何とかいけそうなんだけれど、
コンパイラまでくるとかなり大変じゃないですか?
0290デフォルトの名無しさん
NGNG作ってる人は沢山いると思うよ。
0291デフォルトの名無しさん
NGNGオライリーの lex & yacc 本
>289
アセンブラを出力させるなら、そんなに面倒じゃない。実行できるバイナリを出力
しようと思うと、山のような詳細に追われて力尽きる。
0292デフォルトの名無しさん
NGNGテーブル化するのが。
0293デフォルトの名無しさん
NGNGコンパイラといっても仮想マシンコードに変換するスクリプトコンパイラだってあるし。
ネエィテブなアセンブルや直接、実行形式を吐くコンパイラのことを聞いたつもりでした。
0294ろうひ男爵
NGNG自分は構造化BASICで186のDOSの.COMを出力する物を作ったよ。
今は暇を見つけて簡易的なC言語コンパイラを作ってるよ
0295デフォルトの名無しさん
NGNGCじゃなくてもパスカルでもベーシックでもいいっす。
( ̄人 ̄)オ・ネ・カ・゛イ♪ヽ(* ̄〓 ̄*)ノ^☆ブチュゥゥ♪
0296デフォルトの名無しさん
NGNG0297デフォルトの名無しさん
NGNGhttp://gcc.gnu.org/
0298デフォルトの名無しさん
NGNGほれ
#include <stdio.h>
main()
{
printf("逝ってよし");
}
0299デフォルトの名無しさん
NGNG0300ろうひ男爵
NGNGBASICで、
[ラベル:] if 比較式 goto ラベル
[ラベル:] print "メッセージ"
[ラベル:] 代入式
でよかったら、構文解析もほとんどいらないし簡単じゃない?
改行で行末にして、変数の頭にRをつけてR10とかすれば、
悩むところはないと思うよ。
パスカルだとラベルを読み込むときに細工すればLL(1)だよね、
そんなに難しくないはずだよ。
Cにしろパスカルにしろなにがしらの本を読んだ方が良いんじゃない?
言語はどのレベルの物を作ろうとしてるの?
それと、実行環境はスクリプトで中間言語に落としての実行環境?
0301デフォルトの名無しさん
NGNGどうせ渡されたところで読めない、に 1 票。
言語処理系を作るのが初めてなら、とりあえず「UNIX プログラミング環境」でも
買ってきて hoc の実装追ってみれば?
0302デフォルトの名無しさん
NGNGそれぐらい自分で探せヴォケつー。
0303デフォルトの名無しさん
NGNG0304デフォルトの名無しさん
NGNGいきなり gcc は厳しすぎ。
10年前だと「アルゴリズム+データ構造=プログラム」読めというところだが、
さすがに古いよな…。
0305デフォルトの名無しさん
NGNGはどうよ? インタープリタだけど。
0306デフォルトの名無しさん
NGNG0307デフォルトの名無しさん
NGNG0308デフォルトの名無しさん
NGNGhttp://i.loveruby.net/ja/rhg/index.html
0309ろうひ男爵
NGNG演算子順位法とLL(1)をざらっと、LALRの概説です。
計12ページぐらいだったので、ここにいる方には物足りませんが、
読みやすかったので、人に聞かれた場合にはイイかも。
0310デフォルトの名無しさん
NGNGこれよんでみれ!
0311デフォルトの名無しさん
NGNGコンパイルできないのですか?
じゃあ、かわりにVC++で通るyacc互換でお勧めってあります?
仕事でも使うかもしれないので商用OKだとありがたいのですが。
0312デフォルトの名無しさん
NGNG何かいい書籍はありますか?今は少しづつですが、gccに含まれている
Boehmのソースで勉強してますがなかなか思うように進みません。
VMにそのようなものが書かれているものがあればそれでもOKです。
よろしくお願いします。
0313デフォルトの名無しさん
NGNGとりあえず、>>305に紹介されてる本読むとか。
0314デフォルトの名無しさん
NGNG概説でしかないし、yaccはちょこっとだけしか載ってない。
作るための特集じゃなくて、基礎知識をお勉強するための記事だった。
という印象。
0315デフォルトの名無しさん
NGNGVCでコンパイルできなかったっけ?
まぁいいや。
ttp://www.kohsuke.org/flex++bison++/
これなんかどうよ。使った事無いけど。
0316ろうひ男爵
NGNGさすがにあのページ数だと、1つでも掘り下げるのは難しかったみたいですね。
その中では演算子順位法が分かりやすかったと思います。
0317デフォルトの名無しさん
NGNG通るよ。
でもbisonで生成したコードにはGNUのテンプレートが含まれるので、商用はま
ずかったと思う。
0318デフォルトの名無しさん
NGNG書籍じゃないけど。
http://www.dcs.qmul.ac.uk/SEL-HPC/Articles/GeneratedHtml/comp.gc.html
0319デフォルトの名無しさん
NGNG出力されたコード見れば分るけど 1.24 以降は特例として GPL 適用外になってる。
0320デフォルトの名無しさん
NGNGあ、変わったんだ。サンクス。
0321デフォルトの名無しさん
NGNGここでそのことについて質問してもいいでしょうか?
0322デフォルトの名無しさん
NGNG>yaccやlexの使い方やら言語仕様やらの話題。
だから、宿題丸投げじゃなきゃいいと思うよ。
0323デフォルトの名無しさん
NGNG何か本を入手した?(購入するのも、図書館で借りるのも可。)もしまだなら、
書名:UNIX Literacy Series Vol.12 UNIX yaccとlexの使い方
発行所:HBJ出版局
著者:田中正広
ISBN:4-8337-8728-8
を入手して読んでみるといいYO!現在これ読んで某課題と格闘中(^^;
で、そういった本を読んでから質問するのなら十分OKかと。>>322に同意
0324デフォルトの名無しさん
NGNG0325デフォルトの名無しさん
NGNG作れるよ
0326デフォルトの名無しさん
NGNGまだ、基本概念を勉強中なのですが、Flex&Bisonを使った「C++」用の
チュートリアルや簡単なサンプル実装などないでしょうか?
「C」での実装はいろいろあるんですが、自分はC++で実装したいの困ってます。
C++での解説も申し訳ない程度にはあるんですが、やっぱりサンプルがあると助かります。
0327デフォルトの名無しさん
NGNGC言語をスクリプト言語として動くように作ったことはあるが。
0328デフォルトの名無しさん
NGNG意味あるよ
0329デフォルトの名無しさん
NGNG新規チップの設計用とか?w
0330デフォルトの名無しさん
NGNGユーザにアセンブラ処理系の機能拡張をさせる場合には、スクリプト言語を
そのまま使えるのは嬉しいかも。自前でマクロ言語作るのって手間だし、マ
クロの設計がダサいとユーザの不満もたまるし(w
ただ、往々にしてバイナリ入出力の扱いって C, C++ の方が楽なんだよね。
0331デフォルトの名無しさん
NGNGよしこれから面白くなるってところで、終わってました。
期待してたのにちょっと悲しい。
■ このスレッドは過去ログ倉庫に格納されています