- 1 名前:デフォルトの名無しさん [03/11/29 15:59]
- yaccやlexの使い方やら言語仕様やらの話題。
前スレ 1 pc.2ch.net/tech/kako/981/981672957.html 2 pc2.2ch.net/test/read.cgi/tech/1021136715/ (dat落ち) 関連リンクは多分 >>2-8 あたり
- 792 名前:デフォルトの名無しさん mailto:sage [04/07/30 14:59]
- >>791
一番簡単な方法は yyin = fopen( ... ) ; として yylex() を呼び出します。
- 793 名前:>>778です [04/07/30 15:18]
- >>792さん
ファイルからの読み込みではなく 指定された文字列を受け取って それを変換かけてから、変換後の文字列を 返すというようなプログラムを組みたいのです。 yytextに指定文字列を入れてから yylex()を呼び出せばよろしいのでしょうか? (どこかのサンプルでこのような形のものがあったのですが・・・)
- 794 名前:デフォルトの名無しさん mailto:sage [04/07/30 15:22]
- >>793
ちがいまーす!!(^^; 実は貴方のやりたい事は、書き始めると結構ヘビーです。 素直にflexの本を買ったほうが良いかと・・・・ どうしても買いたくなげは YY_INPUT マクロを気合で読んでみるとか?
- 795 名前:> [04/07/30 15:32]
- >>794 さん
では、入力したい文字列を 一度ファイルに落としてから 再度、yyin = fopen( ... ) ; で読み込むという方法だと まずいでしょうか?
- 796 名前:デフォルトの名無しさん mailto:sage [04/07/30 15:36]
- >>795
それで問題がなければ、それでも良いかと・・・・
- 797 名前:>>778です [04/07/30 16:27]
- 今のサンプルFLEXプログラムは「H16/7/16」を「平成16年7月16日」に
変換するものなんですが、ファイルに「H16/7/16」を書き込み、保存してから yyin = fopen( ... ) ; として yylex() を呼び出すと、「ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ」などと 文字化けが出てしまい、途中で終了してしまいます。 これって何が原因があるのでしょうか?
- 798 名前:デフォルトの名無しさん mailto:sage [04/07/30 17:17]
- cygwin でやるんだったら、ソースファイルとテスト用入力ファイルは EUC にしておく。lex(flex) はマルチバイト文字をマルチバイト文字として扱わないからDIGIT [0123456789]
の書き方だとダメ。 DIGIT (0|1|2|3|4|5|6|7|8|9) だと動くみたい。
- 799 名前:デフォルトの名無しさん [04/07/31 00:18]
- すいませんが、bison.output の見方を解説しているページとか
ご存知ありませんか?
- 800 名前:デフォルトの名無しさん mailto:sage [04/07/31 01:14]
- >>799
見方を理解しようとしないで、LR解析をある程度理解した方 が良いと思うよ。 そうするとbison.outputの意味が分かるようになる。
- 801 名前:799 [04/07/31 22:52]
- LR解析を理解するための、書籍とかありますか?
- 802 名前:デフォルトの名無しさん mailto:sage [04/07/31 22:54]
- はじめてのLR
- 803 名前:デフォルトの名無しさん [04/07/31 22:54]
- 1つの先読みだけしか許されないというのは、かなり不自由かも。
LR(1)を完璧に実装した yacc もどきってご存知ないですか?
- 804 名前:800 mailto:sage [04/08/01 00:44]
- 800ゴット
>>799=801 コンパイラ系の書籍ならば、大抵構文解析の説明はあるでしょ。 手元の本だと『ドラゴンブック』と『コンパイラの理論と実現』と 『コンパイラ(昭昇堂)』にLR解析の話が書いてある。 >>803 知らないけど、あまり不自由を感じたこと無いな>先読み1 たいしたもの作ってないからかな。
- 805 名前:デフォルトの名無しさん mailto:sage [04/08/01 01:08]
- Catalog of Free Compilers and Interpreters.
www.idiom.com/free-compilers/
- 806 名前:デフォルトの名無しさん mailto:sage [04/08/01 02:53]
- >>803
LLだけとboost::splitを使ってみるとか。 boost.cppll.jp/HEAD/libs/spirit/index.html でも、文法を変えたほうがいいかもね LALR(1)の鬼畜パーススピードを捨てるのはもったいないべ。
- 807 名前:デフォルトの名無しさん mailto:sage [04/08/01 03:41]
- LR
LL LALR ってなんの略? (1) ってのは1つ先見るってことでよい?
- 808 名前:デフォルトの名無しさん mailto:sage [04/08/01 04:04]
- manの番号
- 809 名前:デフォルトの名無しさん mailto:sage [04/08/01 06:21]
- >>807
Lonely Rotary Lonely Lolita Lolita and Lonely Rotary
- 810 名前:デフォルトの名無しさん mailto:sage [04/08/01 12:50]
- >>807
LR:左から読んで右から導出 LL:左から読んで左から導出 LALR:ルックアヘッド付きLR
- 811 名前:デフォルトの名無しさん mailto:sage [04/08/01 12:54]
- 【LR】Left-to-right scanning, Right-most derivation in reverse
【SLR】Simple LR 【LALR】LookAhead LR 括弧内は先読みのこと
- 812 名前:デフォルトの名無しさん [04/08/01 15:47]
- LALR(3) ぐらい欲しい。
- 813 名前:デフォルトの名無しさん mailto:sage [04/08/01 15:57]
- >>812
探せば GLR 使えるパーサジェネレータもあるぞ。
- 814 名前:デフォルトの名無しさん mailto:sage [04/08/01 16:49]
- >>812
漏れはむしろ「欲しい例」を出して欲しい。
- 815 名前:デフォルトの名無しさん mailto:sage [04/08/01 18:10]
- 世の中LALR(1)が圧倒的な主流。
それ以外はただの学問的な研究対象か趣味。 まぁ、炉利趣味と同レベルw
- 816 名前:デフォルトの名無しさん mailto:sage [04/08/01 18:11]
- DelphiはLALRじゃないのでは?
- 817 名前:デフォルトの名無しさん mailto:sage [04/08/01 18:40]
- >>815
C++ は LALR(1) に収まらないワケだが。
- 818 名前:デフォルトの名無しさん [04/08/01 21:49]
- >>817
それは書き方が悪いからでしょ? あんなもん、書こうとおもえばいくらでも当てはめられる。 (と思う。)
- 819 名前:デフォルトの名無しさん mailto:sage [04/08/01 21:59]
- 俺はめんどくさいから再起下降でいいよ
- 820 名前:デフォルトの名無しさん mailto:sage [04/08/01 22:38]
- 俺は再帰降下でいいや
- 821 名前:デフォルトの名無しさん mailto:sage [04/08/01 22:40]
- 抗菌加工でいいや
- 822 名前:>>778です [04/08/02 15:41]
- お礼が遅れましてもうしわけございません。
ありがとうございました。 >>794さんがおっしゃっていた YY_INPUT のサンプルをいろいろ 探したのですが、これの他にもDOS窓から入力された文字列を 変換するなんていうマクロなどありますでしょうか?
- 823 名前:デフォルトの名無しさん mailto:sage [04/08/02 16:56]
- >>822
YY_INPUTのサンプルって例えば何? サンプルとかじゃなくて、実際のflexが生成するYY_INPUTマクロを見た方がいいよ。 さらにlexの実装によっては、どう工夫してもお望みのことができないもの もあるから、「文字列から入力」っていうのは可搬性の面ではよくない。 とりあえず、flexだったらYY_INPUTを定義し直せばOK YY_INPUTってのは YY_INPUT(buffer, result, bufsize) buffer:文字列を格納するバッファ result:実際に読み込んだ長さ bufsize:バッファの大きさ で、デフォルトではFILE *yyinから読むようになってるはずだから、それを 君が解析した文字列から読む(コピーする)コードにすれば良いね。 そのまま他の環境にコピーしても動かない可能性があるので注意。
- 824 名前:>>778です [04/08/02 17:55]
- >>823 さん レスありがとうございます。
確かにYY_INPUTは、FILE* yyinを使って処理していますね。 っということは、scanfなどで入力した文字列をYY_INPUT(buffer, result, bufsize) のbufferにコピーしてあげるようなコードを書けばよいということでしょうか? また、違う例として、DBに格納されているデータを取得してきて、 字句変換させるために FILE* yyinならぬextern char* yyin_charなるものを作成して まずはそこにDBのデータをコピーし、YY_INPUT内でbufferにyyin_charを コピーしてあげるような動きでよいのでしょうか? また、実際にmain関数などから、YY_INPUTを呼ぶには、直接呼んでも よろしいのでしょうか? 質問攻めでもうしわけございませんが よろしくお願いします。
- 825 名前:823 mailto:sage [04/08/02 19:18]
- >>842
おいおい、なんか間違えてるぞ。前半は正しい感じだけど、最後のが…? 質問に答えるのは構わないけど、その前に一つ質問させてくれ。 Q. YY_INPUTマクロとは何でしょうか? (何をするものか、誰が使うものか、どこから使うものか、yylex()と YY_INPUTの関係とかに注目。) これに適切に答えられれば、>>824にあるような質問は無いと思う。 さらにおまけとして…、YY_UNPUTとは何? (ヒント:flexの生成するlex.yy.cにすべての答えがある。)
- 826 名前:デフォルトの名無しさん [04/08/02 22:21]
- 結局 >>815は正しいの?
- 827 名前:デフォルトの名無しさん [04/08/02 22:22]
- >>800
質問です。 Lex & Yacc (Nutshell) はいかがでしょうか? これもLRを解説してますか?
- 828 名前:デフォルトの名無しさん mailto:sage [04/08/02 22:31]
- >>826
すぐ下で答えが出てるじゃん。
- 829 名前:800 mailto:sage [04/08/02 22:46]
- >>827
解説してないね。 でも、典型的なシフト還元衝突などの説明と回避方法の解説はある。 ってかこの本もう絶版じゃない? 手に入るの?
- 830 名前:デフォルトの名無しさん mailto:sage [04/08/03 17:27]
- >>791
yyinを指定しないと入力が標準入力になるからそうなるのでしょう
- 831 名前:デフォルトの名無しさん mailto:sage [04/08/03 17:55]
- yyworld
- 832 名前:デフォルトの名無しさん [04/08/06 23:12]
- >>829
一応あるみたいです。 やはり、ドラゴンを理解しないと shift/reduce & reduce/reduce の衝突を完全回避することは難しいですかね?
- 833 名前:デフォルトの名無しさん [04/08/06 23:13]
- 在庫だと思われます。↑
- 834 名前:デフォルトの名無しさん [04/08/09 23:38]
- 注文してしまった。
- 835 名前:デフォルトの名無しさん [04/08/30 00:46]
- age!
- 836 名前:デフォルトの名無しさん [04/08/30 14:29]
- 「コンパイラ構成法」の原田賢一氏の研究室のサイトが見つかりません。
移転したんでしょうか? どなたか、ブックマークつけてらっしゃる方います? コンパイラ構成法のソースコードをゲットしたいんですが。
- 837 名前:デフォルトの名無しさん mailto:sage [04/09/01 10:01]
- う〜ん。名前空間の実装法がわからん。
だれか、参考になるサイトか書籍、知らないか? クラス定義と同じ方法で良いのかなぁ?
- 838 名前:デフォルトの名無しさん mailto:sage [04/09/01 10:32]
- >>837
シンボルテーブルのスタックを作ればいいだけじゃないか?
- 839 名前:デフォルトの名無しさん mailto:sage [04/09/01 13:55]
- >>838
>シンボルテーブルのスタックを作ればいいだけじゃないか? それってディスプレイ・・・・・だよねぇ。 ブロックを開くときに名前を覚えておくようにするんだろうか?
- 840 名前:デフォルトの名無しさん mailto:sage [04/09/01 19:40]
- 例えばC++には複数の名前空間があってややこしい
キーワード 演算子 プリプロセッサ 型 変数 namespace これらは関係を持ったりするしね まあプリプロセッサを除いて基本はみな同じだけど
- 841 名前:デフォルトの名無しさん mailto:sage [04/09/01 19:42]
- 名前空間は
関数 namespace クラス だけじゃないのか?
- 842 名前:デフォルトの名無しさん mailto:sage [04/09/01 19:46]
- ::、using、export、importが絡むとさらに複雑になる
- 843 名前:デフォルトの名無しさん mailto:sage [04/09/01 19:57]
- :: using は簡単
export importはどうだろ
- 844 名前:デフォルトの名無しさん mailto:sage [04/09/01 20:24]
- >>840
何を持って基本というか知らんが、実装しようと思うと namespace は深いぞ。 ADL と関数テンプレートとか。
- 845 名前:デフォルトの名無しさん mailto:sage [04/09/03 18:29]
- 所詮 namespace は、バカ避けの機能。
優秀なコンパイラ屋が血反吐を吐きながら実装するものの、 それによって実行速度が向上する訳も無く・・・ そもそも優秀なプログラマならば、最初から namespace など 必要としない確固としたコーディングスタイルを身に着けている。 そしてバカなプログラマは、せっかく実装してもらった機能の 使い方自体が分からない。バカは所詮バカ。 namespace って、一体何の為にあるんだろう・・・
- 846 名前:デフォルトの名無しさん mailto:sage [04/09/03 18:50]
- ↑ホームラン級のバカ
- 847 名前:デフォルトの名無しさん mailto:sage [04/09/03 19:24]
- 所詮 型 は、バカ避けの機能。
優秀なコンパイラ屋が血反吐を吐きながら実装するものの、 それによって実行速度が向上する訳も無く・・・ そもそも優秀なプログラマならば、最初から 型 など 必要としない確固としたコーディングスタイルを身に着けている。 そしてバカなプログラマは、せっかく実装してもらった機能の 使い方自体が分からない。バカは所詮バカ。 型 って、一体何の為にあるんだろう・・・
- 848 名前:デフォルトの名無しさん mailto:sage [04/09/03 20:04]
- ダウト。残念ながら、型によって実行速度は上がるんだよ。
- 849 名前:デフォルトの名無しさん mailto:sage [04/09/03 20:15]
- いくらなんでも型は重要だろう。
- 850 名前:デフォルトの名無しさん mailto:sage [04/09/03 20:16]
- >>845
評価尺度が実行速度だけとは……。1960 年代の人間ですかい?
- 851 名前:デフォルトの名無しさん mailto:sage [04/09/03 21:23]
- 60年代だったら消費メモリも重要だな。
- 852 名前:デフォルトの名無しさん [04/09/04 01:00]
- 所詮「コンパイラ・スクリプトエンジン」相談室 は、バカ避けのスレ。
優秀なプログラマが血反吐を吐きながら回答するものの、 それによって理解が向上する訳も無く・・・ そもそも優秀なプログラマならば、最初からこのスレ など 必要としない確固とした技術を身に着けている。 そしてバカなプログラマは、せっかく回答してもらった説明の 内容自体が分からない。バカは所詮バカ。 このスレって、一体何の為にあるんだろう・・・
- 853 名前:デフォルトの名無しさん mailto:sage [04/09/04 01:01]
- >>852
ワラタ
- 854 名前:マイク ◆yrBrqfF1Ew mailto:sage [04/09/04 01:22]
- namespaceは最高だな。
感動もんだ。
- 855 名前:デフォルトの名無しさん mailto:sage [04/09/04 11:21]
- >>852
無理してまで回答は僕もしないし、他の人もしてないんじゃない。 コンパイラやスクリプトを作ろうという人口は少ないから過疎なのは仕方が無いが 僕は日ごろから巡回しているし、このスレ向きの質問書けば回答は帰ってくるよ。 もちろん僕もクレクレ君とOO厨房の言語論争的な話題は放置してるけどね。;-P キミには分らないかもしれないが機能しいてない掲示板ではないよ、 進行が遅いに加えて近頃アホっぽい話題が充満しているだけだ。
- 856 名前:デフォルトの名無しさん mailto:age [04/09/04 12:52]
- >>855
( д ) ゚ ゚
- 857 名前:デフォルトの名無しさん mailto:sage [04/09/04 16:13]
- ひさびさにコピペにマジレス見た・・・
- 858 名前:デフォルトの名無しさん mailto:sage [04/09/04 16:48]
- 型の実装について教えてください。
現在 int のみのコンパイラは作れたのですが float などを追加しようとすると例えばスクリプト中の変数に型情報を持たせて 実行するときに int か float か if で判断するしか無いのでしょうか? 2つならまだしも double とか char を追加するとなると代入するとき等の型判定で 組み合わせの爆発が起きそうなのですがなにか良い方法はないでしょうか? 速度的に。
- 859 名前:デフォルトの名無しさん mailto:sage [04/09/04 17:02]
- テーブル作るか int float を別文法にしてしまうか……
てか、こんな事は自分で考えろ。
- 860 名前:デフォルトの名無しさん mailto:sage [04/09/04 17:07]
- >>858
>現在 int のみのコンパイラは作れたのですが >float などを追加しようとすると例えばスクリプト中の変数に型情報を持たせて >実行するときに int か float か if で判断するしか無いのでしょうか? って、そんなのコンパイル出来たって言えないやん。。。 何の為の型なのさ?
- 861 名前:デフォルトの名無しさん mailto:sage [04/09/04 17:11]
- 変数に型情報があってコンパイラを作っているのなら、
コンパイルの時点で型にあったコードを生成するだけだろ。 実行時じゃなくて。
- 862 名前:デフォルトの名無しさん mailto:sage [04/09/04 17:12]
- >>860 ハァ
- 863 名前:デフォルトの名無しさん mailto:sage [04/09/04 18:27]
- >>860
バカ避けの機能
- 864 名前:デフォルトの名無しさん mailto:sage [04/09/04 18:59]
- >>859-861
おぼろげながら自分の間違いが分かってきました。 どうもです。 もう少し考えてみます。
- 865 名前:デフォルトの名無しさん mailto:sage [04/09/04 20:09]
- >>858
実行時に型チェックするかコンパイル時に型チェックするかは、言語の設計に 大きく関わってくるけど、まぁどっちでも良い。 コンパイル時に型チェックしたければ、たとえば Yacc 風に書くと IDENT '=' experssion: { // まず IDENT が変数名であることを確認 // 次に experssion の型が IDENT の型に変換できることを確認 // 型変換して代入するコードを生成 } ; ってな感じ。型変換判定は素直に実装すると型の数の 2 乗のオーダーで増えるが、 テーブルにでも書いておけば大した手間ではない。ベタに if - else とかで書くと死ぬ。
- 866 名前:デフォルトの名無しさん [04/09/04 21:46]
- YACC はバカ避けのソフト。
- 867 名前:デフォルトの名無しさん mailto:sage [04/09/04 22:46]
- 作ってて楽しけりゃなんだっていい
- 868 名前:デフォルトの名無しさん mailto:sage [04/09/05 06:46]
- ( ゚д゚)、ペッ
- 869 名前:デフォルトの名無しさん mailto:sage [04/09/05 15:32]
- 型についてはシンボルテーブルで管理すれば良いでしょ。
シンボル表のエントリに型情報をもたせ、それが基本型を ポイントすることで、個々のシンボルの型を表現します。 struct や class などの基本型をまとめた型を作るときも シンボル表にそれらの新しい型のエントリを作って、基本型を リスト状にポイントしていけばよいです。
- 870 名前:デフォルトの名無しさん [04/09/05 17:16]
- 所詮 lex は、バカ避けのソフト。
(以下ry
- 871 名前:デフォルトの名無しさん mailto:sage [04/09/05 17:47]
- >>855
wrota
- 872 名前:デフォルトの名無しさん mailto:sage [04/09/05 19:51]
- >>870-871
意味の無いレスいれるの止めてくんない、近頃こんなレスばっかりで 前後の見通しが悪くてかなわないんだよ、邪魔だから適当な言語死滅スレにでもいってくれ。
- 873 名前:デフォルトの名無しさん mailto:sage [04/09/05 20:08]
- その発言は結局荒れるもとになるよ。
そして、大量に無駄な情報のなかから有用なものを抜き出すのが2chの利用法だと思う。
- 874 名前:デフォルトの名無しさん mailto:sage [04/09/05 20:12]
- 過疎スレでやってくれるなよなとは思う
- 875 名前:デフォルトの名無しさん mailto:sage [04/09/07 17:20]
- 855=872
- 876 名前:デフォルトの名無しさん [04/09/13 23:46:35]
- >>872
お前のレスこそ余計。
- 877 名前:デフォルトの名無しさん [04/09/13 23:47:49]
- >>872
wrota
- 878 名前:デフォルトの名無しさん mailto:sage [04/09/14 18:08:01]
- 876=877
wrota書くのに一分もかかってんじゃねーよ。
- 879 名前:デフォルトの名無しさん [04/09/14 23:04:15]
- >>878
!= だが何か?
- 880 名前:デフォルトの名無しさん mailto:sage [04/09/14 23:09:55]
- 3日後
870 名前:デフォルトの名無しさん 投稿日:あぼーん あぼーん 871 名前:デフォルトの名無しさん 投稿日:あぼーん あぼーん 872 名前:デフォルトの名無しさん 投稿日:あぼーん あぼーん 〜略〜 879 名前:デフォルトの名無しさん 投稿日:あぼーん あぼーん 880 名前:デフォルトの名無しさん 投稿日:あぼーん あぼーん 何のためのスレなんだか
- 881 名前:デフォルトの名無しさん mailto:sage [04/09/14 23:28:47]
- なんか恐ろしく自己中なヤツがいるようですが…
- 882 名前:デフォルトの名無しさん [04/09/15 00:36:49]
- 名前もあぼーんになるはずだが
- 883 名前:デフォルトの名無しさん mailto:sage [04/09/15 01:04:33]
- このスレ869までしか表示されないな。
- 884 名前:デフォルトの名無しさん [04/09/15 22:07:01]
- まぁ、もしアボーンされるとしても、
>>880 が最初だろw
- 885 名前:デフォルトの名無しさん [04/09/20 01:53:27]
- gccの&&label(Labels as Values)みたいな機能を実現するには、
ラベルは相対じゃなくて、絶対アドレスを取得しなきゃならんのだよね。 void *ptr = &&label; goto *ptr; label: の場合は // void *ptr = &&label; mov DWORD PTR[ebp-04h], label_EA // goto *ptr; mov eax, DWORD PTR[ebp-04h] jmp eax label: こんな感じかな? でも なんで goto ptr; じゃないんだろう? ptrと *ptr は何を指すのか はて。。。
- 886 名前:デフォルトの名無しさん [04/09/20 03:29:47]
- できたできた。
どうやら型をvoid*にしたのはgccの気まぐれらしい。 ラベルの型なんてないからねえ。 int ptr = &&label; goto ptr; これだとラベルと区別つかないからvoid*にしただけか。 gccは変な構文ばっかだな。
- 887 名前:デフォルトの名無しさん mailto:sage [04/09/29 19:53:22]
- VC++でflex++/bison++でリンカエラー回避できますか?
- 888 名前:デフォルトの名無しさん [04/09/30 22:56:07]
- アフォはスルーされるという典型例だなw
- 889 名前:デフォルトの名無しさん [04/10/05 23:30:22]
- C++、Javaで同じスクリプトを動かしたいんですが、
自作するしかないでしょうか。 LuaがJavaに対応していれば一番いいんですが。
- 890 名前:デフォルトの名無しさん mailto:sage [04/10/06 00:42:29]
- >>889
Schemeとか、どっちでも使える言語も結構ある。
- 891 名前:デフォルトの名無しさん mailto:sage [04/10/06 00:57:17]
- そういう意味ではLISP系探すと強いね。
とりあえずS式が読めればなんでもいいわけだし。
- 892 名前:デフォルトの名無しさん mailto:sage [04/10/06 10:39:52]
- >>889
TCLとか
|

|