1 名前:nanashi de fault [02/05/12 02:05] 前スレ1より >yaccやlexの使い方やら言語仕様やらの話題。 前スレ 【コンパイラ・スクリプトエンジン】相談室 pc.2ch.net/test/read.cgi/tech/981672957/ 前スレアーカイブ(かちゅ用) www.1me.jp/hp/prg_c-s_lab 前スレに張られたリンク + x >>2-6
775 名前:デフォルトの名無しさん [03/07/13 05:23] 自己記述可能なオブジェクト指向の言語処理系で予約語や特殊記号の数が最小のものってどっかに転がってませんかね
776 名前:_ mailto:sage [03/07/13 05:25] homepage.mac.com/hiroyuki44/
777 名前:デフォルトの名無しさん mailto:sage [03/07/13 12:51] >>775 scheme
778 名前:通りすがり mailto:sage [03/07/14 07:23] 因みに何で760はスルーなんですか?
779 名前:通りすがりっていうか mailto:sage [03/07/14 07:24] 多分760をここに誘導した奴なんだけどね。
780 名前:デフォルトの名無しさん mailto:sage [03/07/14 11:45] >>778 まずインデントをどうにかしてくれんと読む気にならん。 ぱっと見、文法をどうにかしろよって感じだが。
781 名前:山崎 渉 mailto:(^^) [03/07/15 09:51] __∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
782 名前:デフォルトの名無しさん mailto:sage [03/07/17 13:25] >>767 アクションは後回しにして、まず文法だけ集中して考えてみたら。 ふつうはまず文法だけで書いて動かしてみて、正しくreductionが行なわれるかを確認 しますよね。 var_lists :INT arrays SEMI |var_lists KONMA INT arrays SEMI ; これだと int v, int x; なんていうのが通ってしまうけど… かなり混乱してます。もうちょっと整理しよう。
783 名前:760 mailto:sage [03/07/19 11:17] >>782 レスありがとうございます なんとか自分で解決できました
784 名前:デフォルトの名無しさん [03/07/19 11:51] 600番台は危険な香りがしたのであげ
785 名前:デフォルトの名無しさん [03/07/23 19:12] 初歩的な質問なんですけど字句解析の段階で 「どちらとも言えない」トークンが出てきた場合はどうすればいいのでしょうか? 例えば C の * は 1 * 2 のような乗算演算子なのか *ptr -= 4 のようなデリファレンス演算子なのか 単純に字句解析だけしていくとわからないのです。 いくつか考えたのですが。 1.構文解析や意味解析から字句解析を呼び出すようにして、それらの処理内容を字句解析に使用する 2.TOKEN_ASTERISK のように中途半端な状態にして構文解析の段階で適切な物にする 3.とりあえず OP_MULTIPLY みたいにどっちかにしておいて、後で不適切だった場合に OP_DEREFERENCE など適切な物に置き換える もしくは上記以外のもっと賢い方法があるのでしょうか? よろしくお願いします。
786 名前:デフォルトの名無しさん mailto:sage [03/07/23 20:24] >>785 1*2 の形の奴が単項演算子であるわけが無い。 *ptr の形の奴が2項演算子であるわけが無い。 よってどちらともいえないトークンではない
787 名前:デフォルトの名無しさん mailto:sage [03/07/23 20:39] >>786 例が良くないだけで、問題は依然として解決していないと思うが? MyClass::Member * a; C++のこれは宣言?それとも乗算? >>785 どれでもOK。標準はない。 俺だったら2を選ぶけど、それも参考程度にね。
788 名前:785 mailto:sage [03/07/23 22:40] >>786 & >>787 レスありがとうございます。 もしかして私の「字句解析」っていう言葉への認識って間違ってるのかなと思っちゃったのですが、 字句解析って「字面からわかる範囲で」文字列をトークンに切り出していく作業だと思っていたのですが 前後のトークンの状態などまで見るべきものなのでしょうか? つまり単項か2項かというのは前後のトークンがわからなければ決定できないと思うのですが そういう所まで見るのが普通なのでしょうか? (前のトークンはともかく、後のトークンまで判別に使うとするとかなり難しい事になりますよね) 一般論という感じでいいのですが、ご教授ください。 よろしくお願いします。
789 名前:デフォルトの名無しさん mailto:sage [03/07/23 22:55] >>788 > 字句解析って「字面からわかる範囲で」文字列をトークンに切り出していく作業だと思っていたのですが それであってる。 > 前後のトークンの状態などまで見るべきものなのでしょうか? そうする処理系もある。 ただそれは、純粋に字句解析だけでなく、一部構文解析も含んだ処理ということになる。 > つまり単項か2項かというのは前後のトークンがわからなければ決定できないと思うのですが > そういう所まで見るのが普通なのでしょうか? これも処理系によりけりで、>>785 のどれになるかはいろいろ。 字句解析と構文解析の境界は、厳密に分かれているとは限らない。 今みたいに曖昧な場合や、いっそ「字句+構文解析」をしてしまうこともある。 逆に、あらかじめ曖昧さが生じないように言語を設計する場合もある。 ・・・あんまり役に立ってないな、俺。 まぁ、生きた例を知りたいなら、解析器や言語処理系のソースを読むのが一番。
790 名前:785 mailto:sage [03/07/23 23:43] >>789 レスありがとうございます。 なるほど、厳密にパートを仕切る必要はないんですね。 >・・・あんまり役に立ってないな、俺。 そんな事ないです。日曜プログラムなので、周りに聞く人もいなくて 参考書籍とか雑誌とかもいくつか引っ張り出してきたりしてみたんですが、 疑問が出てきちゃったら正解かどうか確認する手段がないので、 こういう風に「それで間違いない」とか「それはこういう意味だよ」って答えてくれるだけで とても助かります。ありがとうございました。
791 名前:ろうひ男爵 mailto:sage [03/07/24 07:53] >>785 ラベルが AAA: の場合にも、字句解析で1文字先読みして":"まで確認するものが多いですしね。 じぶんも、2)の中途半端な物にしておきます。
792 名前:デフォルトの名無しさん mailto:sage [03/07/24 08:02] C++パーサーとかjavaパーサー用の .l .yファイルってどこかで公開されてませんか?
793 名前:デフォルトの名無しさん [03/07/24 15:44] >>785 C言語のパーサーの話なら、おたずねの * に関して字句解析が気にかける必要 はありません。それらの区別は構文解析の責任です。字句解析では'*' という トークンを返せばそれで良いのです。 では字句解析はつねに文脈を気にしないで良いのかというとそうでもありません。 たとえばC のtypedef名は TYPEDEF_NAME というトークンを返さないと正しく 構文解析ができませんので、字句解析はidentifierを見たときに記号表を見て、 それがtypedef名として登録されているかどうかを調べなくてはいけません。 typedef名であれば TYPEDEF_NAME を、そうでなければ IDENTIFIER を返す のです。 # 実はCの構文解析ではこの後さらに、TYPEDEF_NAMEを通常のidentifierとし # て解釈するという処理もしなければならないのですが、初心者が混乱すると # いけないのでこのへんでやめときます。
794 名前:デフォルトの名無しさん mailto:sage [03/07/25 02:53] なぜおまえらLISPを使わんのだ
795 名前:デフォルトの名無しさん mailto:sage [03/07/25 03:04] Lispを使うスレでないから
796 名前:デフォルトの名無しさん mailto:sage [03/07/25 06:35] Lispはクソだから
797 名前:デフォルトの名無しさん mailto:sage [03/07/25 13:57] 括弧悪いから。
798 名前:デフォルトの名無しさん mailto:sage [03/07/25 19:32] 括弧(・∀・)イイ!
799 名前:ろうひ男爵 mailto:sage [03/07/25 21:14] >>797 ワタラ。
800 名前:デフォルトの名無しさん mailto:sage [03/07/26 02:50] >>799 激しく同意
801 名前:デフォルトの名無しさん mailto:sage [03/07/26 18:27] おまえらLISPは柔軟だからコンパイラやアセンブラとかを LISP自身で書けるんだぞ。そもそも記号処理は得意分野だからな。 CやJavaで組むより簡単だろう。 実装側の言語に頼る量も最小で済むんだぞ。 なぜ使わんのだ。
802 名前:デフォルトの名無しさん mailto:sage [03/07/26 18:28] >>797 括弧悪い?アホか。 括弧の量なんて些細な事でしかない。
803 名前:デフォルトの名無しさん mailto:sage [03/07/27 08:34] >>802 通じて無いよこの人
804 名前:デフォルトの名無しさん mailto:sage [03/07/27 14:24] Lisp厨うぜぇ。 括弧読みにくいんだよ。 いつまでもマイナー言語でオナニーしてろよ、ボケ!
805 名前:デフォルトの名無しさん mailto:sage [03/07/27 15:47] Lisp厨以上に厨さを醸し出す>804 コイツ、ウザッ
806 名前:デフォルトの名無しさん mailto:sage [03/07/28 07:32] >>801 Lispじゃなくても、コンパイラやアセンブラはその言語自身でかけるが・・・
807 名前:デフォルトの名無しさん mailto:sage [03/07/28 07:32] ああ、すまん。より簡単だといいたいわけね。 本当にそうなの?
808 名前:デフォルトの名無しさん [03/07/28 09:27] 字句解析についての質問なんですが、 自前でトークンを切り出すコード (もし先頭がアルファベットならwhileで延々読み込みみたいな)の実行速度と lexで吐き出すコードの実行速度ではどちらが早いんでしょうか?
809 名前:デフォルトの名無しさん mailto:sage [03/07/28 13:51] 実装次第
810 名前:棄教者 ◆egKIKYO7cg mailto:sage [03/07/28 14:50] >>808 オートマ車とマニュアル車とどっちが燃費いいかという命題に似ている。
811 名前:デフォルトの名無しさん mailto:sage [03/07/28 18:24] >>808 のような質問をする人間にはマトモな実装が出来るわけが無い、と仮定すると lex の吐き出すコードのがマシと思われ。
812 名前:デフォルトの名無しさん mailto:sage [03/07/28 18:51] >>811 の誤りは、自明なことをあらためて仮定したこと。
813 名前:名無し@沢村 [03/07/28 20:47] おまいらよ、コンパイラやスクリプトエンジンよりも、TVウェアをつくってみないか? pc2.2ch.net/test/read.cgi/tech/1059262203/l50
814 名前:808 [03/07/28 21:53] 実装次第ですが・・・ありがとうございました。 初めてlexのコード見たんですが 移植する時間も自信も・・・なので諦めました・・・ メモリも全然使えない環境ですし・・・
815 名前:デフォルトの名無しさん [03/07/29 19:20] >>814 綴りの認識程度ならlex(というかDFA)は大袈裟な気がする。 僕だったら、連続するアルファベットと数字を連結して単語にし、事前に作っ ておいたハッシュ表を索いておしまいにします。 ハッシュ表は、完全ハッシュ関数を作成するツール(GNU gperf)を使えば、 かなり小さくできるし。
816 名前:デフォルトの名無しさん mailto:sage [03/07/29 23:49] >>808 最初で、しかも簡単な物でしたら、手で作ってみるのもいいのではないでしょうか。 それからlexを覚えた方が理解が深まりますし。
817 名前:デフォルトの名無しさん mailto:sage [03/07/30 00:31] 手作りするより、早めにlexの使い方を覚えた方が 後々楽な気がするけど。 まあ、時間に余裕があるなら。
818 名前:デフォルトの名無しさん mailto:sage [03/07/30 12:19] 801 ではないが,Lisp の場合 字句解析 -> 不要 構文解析 -> すでに終わってる なので激しく楽なのは間違いない.本の章一つで Lisp のサブセットやそのコンパイラの作成法が載るくらい.
819 名前:デフォルトの名無しさん mailto:sage [03/07/30 23:08] LISP Scheme Pert8テンプレより Lisp 言語処理系: CAMPUS LIsP, Lemon version ttp://aten.aial.hiroshima-u.ac.jp/~kakugawa/clisp/index-ja.shtml Cコードによるわずか1000行の実装 ちなみにLispのマクロは字句解析と構文解析の間に作用するので、 別の言語のインタプリタをLisp上に作ることができる。 Paul GrahamのOn Lispという本(Web公開中)ではCommon Lisp上の Prologインタプリタが解説されているし、 Richard Fateman教授のサイトには(おおっぴらには載せてないが) Common Lisp上のMathematicaサブセットのインタプリタのソースが置いてある。 いずれもマクロを活用している。 おまけ bison, flexマニュアル和訳 ftp://ftp.ascii.co.jp/pub/GNU/
820 名前:デフォルトの名無しさん mailto:sage [03/07/31 12:43] lisp厨は逝けよ。 lispのマクロで満足できるならこのスレには来るわけないんだからさ。
821 名前:デフォルトの名無しさん mailto:sage [03/07/31 18:04] >>820 このスレで無駄に時間浪費した挙句、互換性のクソもない コンパイラ・インタプリタなんぞ作って、いったい誰が使うのかな。
822 名前:デフォルトの名無しさん mailto:sage [03/07/31 19:01] >>821 スレの存在そのものに疑義があるんなら立ち入ってくるなっつの。
823 名前:デフォルトの名無しさん mailto:sage [03/08/01 02:36] >lispのマクロで満足できるならこのスレには来るわけないんだからさ。 lispのマクロを極めた人しかこんなことは言えないと思うのですが。
824 名前:デフォルトの名無しさん mailto:sage [03/08/01 03:05] >>823 馬鹿だろ? lispでマクロを極めようがどうしようが、んなことはフルスクラッチで スクリプトエンジンを組みたい奴の欲求には答えられないっていってるの。 プロトタイプだけ作って満足するならともかく。 こういう場を読めないLispスノッブが大杉。
825 名前:デフォルトの名無しさん mailto:sage [03/08/01 03:46] >>824 お前こそ馬鹿だろ? lispのマクロがプロトタイプだけしか作れなくて フルスクラッチの方がえらいみたいに考えてるところが。
826 名前:デフォルトの名無しさん mailto:sage [03/08/01 05:23] 824じゃないが >> フルスクラッチの方がえらいみたいに考えてるところが。 > スクリプトエンジンを組みたい奴の欲求には答えられないっていってるの。 Lispでどんあ言語でも作ることができる何て言ってるヤシは、 Lispしかやったこと無いヤシ。
827 名前:デフォルトの名無しさん mailto:sage [03/08/01 05:46] どんな言語でも大抵の言語は作れるよ
828 名前: mailto:sage [03/08/01 07:34] flexで最後にマッチした文字列が入るyytextには'\0'は付加されるの? guppy.eng.kagawa-u.ac.jp/~kagawa/1999/SysProg/both.html では付加されないから注意が必要と書いてるけど www.geocities.co.jp/SiliconValley-Oakland/3432/man/flex/flex-ja_4.html#SEC35 とかのサンプルみてるといきなりstrcpy(yylval.name,yytext)見たいな感じのコードがあるんだけど。 strcpyはソース側がNULL文字終端じゃないといけないよね。 それとも自分が何か勘違いしてるのかな?教えてください。
829 名前:デフォルトの名無しさん mailto:sage [03/08/01 11:39] >>827 そりゃアセンブラでも作ることはできるだろう。 ようはどれだけ簡単に作ることができるかだ
830 名前:デフォルトの名無しさん mailto:sage [03/08/01 12:21] >>828 というかこれにぶっ飛んだよ。 %union{ char name[128]; }
831 名前:デフォルトの名無しさん mailto:sage [03/08/01 13:29] >>826 Lispスノッブ大杉って,漏れには数人しか見えないが…. コンパイラやスクリプトエンジン書くのに言語やツールなんか関係ねーだろう. フルスクラッチがいいなら Lex も Yacc も使わずに全部手でかけばいいじゃん.
832 名前:デフォルトの名無しさん mailto:sage [03/08/01 14:00] 最近Schemeを勉強し始めたんだが、現時点での感想。 利点 - GCがあるので、メモリ管理が楽 - リストや木などを処理し易い - S式を入出力する手続きが用意されている 途中結果の出力や、個々の手続きの動作検証がし易い - シンボル シンボルを使うとシンボルテーブルを新たに作らなくてもよいかもしれない。 欠点 - lexやyaccのようなデファクトスタンダードなツールがない guile絡みでLanguage Implementation Toolなるものがあるらしいが、 どういう位置づけのものなのかは知らない。 - 動作が遅い ネイティブコードを吐くコンパイラもあり、速いらしい。 それでも、チューニングをし出すとCとかで組んだ方が速くなると思う。 - マクロ Schemeは処理系によってマクロの書き方が違う。 - 資料が少ない 検索しても見つかるのは、Schemeの処理系を作る話ばかり。 On Lispに載っていたPrologインタプリタは、Prologの機能を マクロとかを使って実現するという話ぽかった。 もしかしたら前の方の章にProlog→S式変換の話があったりするとか?
833 名前:832 mailto:sage [03/08/01 14:07] まだ、Schemeではプログラムをあまり書いていないので、 先入観も含んじゃっています。
834 名前:828 mailto:sage [03/08/01 14:14] >>830 すいません、まだ勉強始めたばっかりでなんでぶっ飛んだのかわかりません。 あとflexは自動的にヌル終端文字列にしてくれるんですか?
835 名前:デフォルトの名無しさん mailto:sage [03/08/01 14:21] >>821 > 互換性のクソもないコンパイラ・インタプリタなんぞ作って、いったい誰が使うのかな。 このスレで書いてはならない事を書いたね。
836 名前:デフォルトの名無しさん mailto:sage [03/08/01 18:47] ごめん
837 名前:デフォルトの名無しさん mailto:sage [03/08/01 18:55] >>836 素直だ。
838 名前:デフォルトの名無しさん mailto:sage [03/08/01 19:00] >>834 %unionってスタックの要素になるんだが、それを128byteとる豪儀(藁)さに。 終端はしないはず。
839 名前: mailto:sage [03/08/01 21:03] >>838 おお、どうもありがとう。
840 名前:デフォルトの名無しさん mailto:sage [03/08/01 21:31] すまん、されてるっぽいよ。
841 名前:デフォルトの名無しさん mailto:sage [03/08/01 23:52] >>832 なんで Lisp 厨を刺激しそうなことを書くかね・・・。 とりあえず、フォローしておこう。ちょっと検索したけど Scheme 用の LALR パーサジェネレータとかある。資料も英語なら本が何冊もオンライン で読めるみたいだし。
842 名前:デフォルトの名無しさん mailto:sage [03/08/01 23:52] >>832 なんで Lisp 厨を刺激しそうなことを書くかね・・・。 とりあえず、フォローしておこう。ちょっと検索したけど Scheme 用の LALR パーサジェネレータとかある。資料も英語なら本が何冊もオンライン で読めるみたいだし。
843 名前:841 mailto:sage [03/08/01 23:54] うげ、なぜか二重カキコに。吊ってきます。
844 名前:山崎 渉 mailto:(^^)sage [03/08/02 02:12] (^^)
845 名前:デフォルトの名無しさん [03/08/02 04:03] 逆アセンブラはスレ違いですか?
846 名前:デフォルトの名無しさん mailto:sage [03/08/07 22:30] 何でもいいからネタキボンヌ
847 名前:デフォルトの名無しさん mailto:sage [03/08/11 19:10] 七度文庫
848 名前:デフォルトの名無しさん [03/08/12 13:41] ゲームキャラのAIをスクリプトで書けるようにしようと思っています。 JavaScriptを使おうとおもうのですが、組み込んで使えるものなのでしょうか? VC6使っています。
849 名前:デフォルトの名無しさん mailto:sage [03/08/12 14:18] >>848 ちょっと探したら、こんなのみつけたけど。 MozillaのJavaScriptのページ jt.mozilla.gr.jp/js/
850 名前:デフォルトの名無しさん [03/08/12 17:20] 組み込み用途なら、JavaScriptとPerl、どっちがいいですか?
851 名前:デフォルトの名無しさん mailto:sage [03/08/12 20:28] どっちもデカ過ぎるような…。コンパクトな自作言語のがよくないか? まぁ、Python なんかは組み込まれてるの見かけるから漏れの感覚が古い のやもしれず。
852 名前:850 [03/08/12 20:42] Luaが小さくてよさげなのですが、明らかにJavaScriptやPerlと劣っている点はありますか? 小さいことは気にしないのですが、いざ使ってて大きな落とし穴に落ちたら人生いやけがさして多分漏れ自殺します。
853 名前:デフォルトの名無しさん mailto:sage [03/08/12 21:05] が ・ ん ・ ば
854 名前:デフォルトの名無しさん mailto:sage [03/08/12 21:53] LISPがいい
855 名前:デフォルトの名無しさん mailto:sage [03/08/13 04:00] >>852 Luaは最初から組み込むことを前提に考えて作ったっぽいからいいかも。 ただ小さい代わりに言語仕様もライブラリも他と比べて貧弱なので。
856 名前:850 [03/08/13 11:23] たしかに用意されているライブラリは少ない感じがします。 ただ、組み込み用途で使うのであれば、幾つかの型が扱えて ifやwhileなどの制御構文が使えればOKかなぁ。。。 スクリプト側ではフロー制御みたいなことしかやらず、どうせ アプリ側のAPI呼び出しに徹する形になるだろうから。
857 名前:デフォルトの名無しさん mailto:age [03/08/14 17:20] JavaCC使っている人いる? 久しぶりにJavaCCを使おうと思ったら、antからビルド出来なくなっていた。 もちろん、コマンドラインからはjavaccもjjtreeも普通に使えている。 COM.sun.labs.javacc.Mainという存在しないクラスを探すのが原因らしく、 そこを"org.javacc.parser.Mainに書き換えただけで動いた。 sfに移動してから結構経っているのに、誰も気付かなかったのかな。
858 名前:山崎 渉 mailto:(^^) [03/08/15 15:24] (⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
859 名前:デフォルトの名無しさん [03/08/16 18:29] ほしゅっ
860 名前:デフォルトの名無しさん [03/08/19 21:52] >>764 最近アルバイト先で使ったLSI設計ツール、Tclが組み込まれていた。 もちろん商用アプリなんだけど、Tclって商用利用に使ってもいいんですね。 いや、単に不勉強で、ちまたのスクリプトの何が商用利用(商品に組み込んだ うえで販売)でき、何はだめなのか、よく知らなかったので、たまたまTclを 見つけて「へぇ、こういうふうに商品にもつかっているんだ」と、感心したという だけの話なんですが。
861 名前:デフォルトの名無しさん mailto:ege [03/08/19 23:46] おまえらの中で、boost::spiritを使ってる人いませんか? どんな感じのものなのですか?
862 名前:デフォルトの名無しさん mailto:sage [03/08/20 05:43] ガーベッジコレクションの話題はこのスレでいいのかな?
863 名前:デフォルトの名無しさん mailto:sage [03/08/20 06:19] ↑無関係ではないが、うーん、ちと違う気がするな。
864 名前:デフォルトの名無しさん mailto:sage [03/08/20 06:58] >>862 LISP Schemeスレなら受け入れてくれると思うよ。 自作派が多いから。
865 名前:デフォルトの名無しさん mailto:sage [03/08/21 13:44] >>861 下のサイト見るか、boost スレ行って訊けば? ttp://www.fides.dti.ne.jp/~oka-t/cpplab-boost-spirit.html