『コンパイラ・スクリプトエンジン』 相談室 2 at TECH
[2ch|▼Menu]
[前50を表示]
650:649
03/05/23 18:26
First集合,Follow集合,Director集合は、
ある文法がLL(1)文法かどうかを調べるためだからとりあえず読み飛ばすことにします・・・

651:649
03/05/23 18:30
>>648
去年、"Linkers & Loaders" (John R.Levine著 ポジティブエッジ訳・オーム社)を読んだのですけど、
説明がかなり大雑把で実装レベルで直接役立てるのはちょっと無理な気がしました。

652:デフォルトの名無しさん
03/05/23 18:31
大したこと書いてないので、斜め読みで十分。
とにかく、実際に作ってみるのが○

653:652
03/05/23 18:34
中田育男の「コンパイラ」本のことね。

654:649
03/05/23 18:48
>>652-653
レスありがとうございます。
私は情報工学は素人なので、斜め読みするほどの能力はありませんが、
理論から導き出される結論自体はそれほど難しいとは思っていないので
なんとか最後まで読んで見ます。

655:逆コンパイラ
03/05/23 20:16
EXEファイルをC言語に戻す逆コンパイラソフトを教えてもらえませんか。

656:デフォルトの名無しさん
03/05/23 20:22
戻す?

657:デフォルトの名無しさん
03/05/23 20:38
>>655
URLリンク(www.itee.uq.edu.au)
URLリンク(www.backerstreet.com)

658:逆コンパイラ
03/05/23 20:47
>>657
上の一番のHPのdcc Decompiler はどこからダウンロードしますか

659:デフォルトの名無しさん
03/05/23 22:32
>>658
Table of Contentsの中に思いっきり「配布」という単語があるわけだが。
辞書とか翻訳サイトつかってでもContentsの一覧ぐらいは一通り嫁。

660:デフォルトの名無しさん
03/05/26 23:13
↓VMにも色々あるようですが、どういう方式でしょうか?
memory to memory
SICD machine
chemical abstract machine
categorical abstract machine
while-if machine

661:649
03/05/27 15:02
中田育男氏のコンパイラを読み終わって、PL/0'のソースコードをざっと眺めていたのですが・・・
字句解析と構文解析以外は普通のプログラミングですね。
結局はyacc&lexの勉強をしろということでよろしいでつか?

662:棄教者 ◆egKIKYO7cg
03/05/27 15:51
>>661
そりゃ天下のGCCだって構文解析器はBisonを使って書かれているからね。


663:デフォルトの名無しさん
03/05/27 16:02
>>661>>662
若者ならyaccは無視してantlrをやったほうがいいでしょうか?


664:649
03/05/27 16:24
>>663
漏れも良く分からないけどJava環境ならANTLRになるのでは?
漏れはC言語使うのでyaccが魅力的でつ

665:デフォルトの名無しさん
03/05/27 16:30
>>663
若者ならまずは手書きから始めるのが良いですよ。
言語にもよるけど、再帰的降下法はいちばん単純でわかりやすい。

パーサジェネレータを使う場合にも、一度手書きパーサを経験しておかないと
なにがなんだかわからない、という人が多いようです。


666:デフォルトの名無しさん
03/05/27 16:46
どうも。やってみます。ただ、23歳はもう若者じゃなかったかもしれません。

667:デフォルトの名無しさん
03/05/27 17:52
あっというまに

668:649
03/05/27 17:53
>>665
手書きの経験が必要でつか?
漏れは若者じゃないからいいや・・・

669:デフォルトの名無しさん
03/05/27 17:56
手書きの方が速い

670:デフォルトの名無しさん
03/05/27 18:05
昔、手書きでCコンパイラを作るとかぶちあげて、全く後が続かず、
入院したことにして結局うやむやにした香具師がいたな。


671:デフォルトの名無しさん
03/05/27 18:10
ただのツール使いはヘタレ。

672:名無し@沢村
03/05/27 20:29
おまいらよ、コンパイラは字句解析と構文解析だけではないぞ。
いいか、コンパイラはな、字句解析、構文解析、意味解析、最適化、リンカ、ローダとどれが欠けてもダメよ。わかるか?
おまいらに、コンパイラをつくる能力があるか?

673:デフォルトの名無しさん
03/05/27 20:53
アセンブラなら作ったことあるぞ。
コンパイラからアセンブリコード吐かせればOKだな。

674:デフォルトの名無しさん
03/05/27 20:59
最適化はあくまでオブションだし、ローダはOSの仕事だがなw

675:デフォルトの名無しさん
03/05/27 21:14
>>672
大半の人が作りたいのはスクリプトのコンパイラでないの?
それなら、字句解析、構文解析、意味解析だけで何とかなるのでは。

676:デフォルトの名無しさん
03/05/27 21:30
>スクリプトのコンパイラ
バイトコードコンパイルという意味だよね?


677:デフォルトの名無しさん
03/05/27 22:40
>>676
そうっす

678:デフォルトの名無しさん
03/05/27 22:50
リンカはリンカだろ・・

679:デフォルトの名無しさん
03/05/27 23:07
>>678
Delphiのよーに、コンパイラがリンクまでやってくれると便利なときがあるよ。
同じシンボルがエクスポートされた.objも、別々のユニットから{$L}で取り込めば呼び分けられるし、
リンクエラーとか名前の衝突とかも、リンカじゃなくてコンパイラのエラーになるので
原因となるソースコード上での位置がわかるし。

680:デフォルトの名無しさん
03/05/28 05:29
>>674
正直、最近のマシンは最適化してやらないと実力が出ないから
コンパイラ/インタプリタでの最適化は重要だし、
処理系のコード的にも非常に大きな部分を占めてるんだが。

681:デフォルトの名無しさん
03/05/28 05:36
>>680
追伸:
オプションなのは最適化なんてしなくていいってコトじゃなくて
様々な最適化技法がプログラムの性質によってそれぞれ有効度があり、
あまり効かなかったり却って遅くなるような場合に外したりパラメータを調節するのが目的。
(昔はデバッグを簡単にする目的もあったけど最近のデバッガは優秀だから
最適化されていてもデバッグできたりするらしいね。)

682:デフォルトの名無しさん
03/05/28 06:00
ほう。最近のデバッガは、最適化で消えた変数も追いかけられるようになったりするの?

683:デフォルトの名無しさん
03/05/28 07:37
消えたといっても、スタックローカルからレジスタに移っただけだろ? だからレジスタにある間は追いかけられる。

684:デフォルトの名無しさん
03/05/28 10:30
最適化について知らないなら、まず調べてから書いてください。

685:デフォルトの名無しさん
03/05/28 11:32
681が言ってるのはインライン展開とか実行順変更程度なら大丈夫という話
682が言ってるのは完全に消えた変数の話
683が言ってるのはレジスタ最適化の話
684が言ってるのは・・・・?

686:山崎渉
03/05/28 12:35
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎―◎                      山崎渉

687:デフォルトの名無しさん
03/05/28 15:24
Compiler Design in C
URLリンク(www.amazon.com)
URLリンク(www.holub.com)

て読破したかたいらっしゃいますか?
古すぎますかね。

688:名無し@沢村
03/05/28 16:00
おまいら、『コンパイラ・スクリプトエンジン』について相談してみろ?

689:674
03/05/28 17:41
>>680
672があまりにいいかげんなこと言っていることを踏まえての内容です。
実用性から言えば、680,681に書かれたことは誰でも認める常識かと。

690:デフォルトの名無しさん
03/05/28 17:44
だから沢村に関わるなとあれ程言ったのに

691:デフォルトの名無しさん
03/05/29 00:33
ここには↓を解説できる者はおらんのか?
memory to memory
SICD machine
chemical abstract machine
categorical abstract machine
while-if machine

692:デフォルトの名無しさん
03/05/29 00:49
>>691
つーかどっから拾ってきたの?論文読めよ。
名前間違ってるのもあるし。

693:名無し@沢村
03/05/29 05:08
おまいらよ、ここで『コンパイラ・スクリプトエンジン』について知ったかで語ってるやつは多いが、
その割りには世に『コンパイラ・スクリプトエンジン』はそれほど多く出てないが…?
みんな自分だけで使ってんの?
それとも起動したと同時に終了してしまうコンソールアプリケーション?

694:デフォルトの名無しさん
03/05/29 05:18
自分のアプリケーション用だろ。
はじめから世に出すつもりで作っていない。

695:デフォルトの名無しさん
03/05/29 07:34
世に出してほすぃ
設計から実装まですべてさらけだしてほすぃ

696:デフォルトの名無しさん
03/05/29 07:42
さらけ出てるじゃない >>241 >>487


697:デフォルトの名無しさん
03/05/29 08:49
自分のプログラムにちょっとしたマクロを実装できたらいいなあ〜
って類がこのスレの対象だろ。

698:デフォルトの名無しさん
03/05/29 09:53
>>693
> それとも起動したと同時に終了してしまうコンソールアプリケーション?
こんなやつかW?

int main() {return 0;}

699:デフォルトの名無しさん
03/05/29 14:28
>>697
最適化に拘らないならXMLとXMLパーサーを使ってみるという選択は?
(APIはSAXでもDOMでもお好みで。)
文法の自由度は減るけど
ちょっとしたものなら自分でパーサー書くより楽だよ。

例えばmakeと同じような仕事をするANT(だったっけ?)の
プロジェクトファイル(だったっけ?)はXMLらしいぞー(じゃー、ゴボゴボゴボ)。

700:デフォルトの名無しさん
03/05/29 14:42
>>699続き
入力にフォーム、出力はスタイルファイル(CSSでもXSLでも)とでもすれば偽IDE環境も簡単w。

またあるいは、かつてWEB(だっけ?今文献は引越しダンボールの中なんで)という
TeX+Pascalの文芸的プログラミングに憧れた人にもXMLマークアップでプログラミング言語というのは
それなりに面白い選択かと。

701:デフォルトの名無しさん
03/05/29 17:52
>>699
XMLなんてクソ

702:名無し@沢村
03/05/29 18:53
>>698
コンソールアプリケーションって、たいがい起動したと同時に終了するだろ?

703:名無し@沢村
03/05/29 18:56
>>698
てか、コンソールアプリケーションって、一応処理はするんだが、起動して処理をして終了までが、あっという間だから、起動したと同時に終了するように見えるんだな。

704:デフォルトの名無しさん
03/05/29 19:25
名無し@沢村はどんな『コンパイラ・スクリプトエンジン』を作っているのかな?

705:デフォルトの名無しさん
03/05/29 19:43
>>701
何故ぇ?w

706:デフォルトの名無しさん
03/05/29 19:47
>>702-703
( ´_ゝ`)


707:デフォルトの名無しさん
03/05/29 20:58
>>699
素から書いたら面倒だけどyacc/lexとかツール使うと工数はxmlと殆ど変わらないと思うけど。
むしろ切り出した後のエラーチェックとか加工とかがxmlだと面倒だなぁとか感じたりするんですけど。


708:名無し@沢村
03/05/29 21:01
>>704
おれは、起動、コンパイル、実行、終了までが一瞬のうちに終わるスクリプト言語をつくったよ。
コンソールアプリケーションでね。

709:デフォルトの名無しさん
03/05/29 21:03
>>708
int main() {return 0;}
が実行できるスクリプトか?
すばらしい(藁)

710:デフォルトの名無しさん
03/05/29 21:18
Parrotでいいじゃんよ

711:デフォルトの名無しさん
03/05/29 21:59
>>707
エラーチェックはXML Schema + 検証機能つきパーサで。
切り出し&加工はDOMでやれば楽かも。

書ける言語がXML整形式の範囲に縛られるわけだから
なにがなんでもXMLとは思わないけど、文書としても利用されるような
宣言的なスクリプト(例えばモジュールの依存関係を記述するメイク・ファイルや
プロジェクトファイルみたいなのとか、環境設定とか、各種ポリシーの記述とか、
各種シーンの記述とか…。)にはいいかなと。

私自身はとあるTRPGのシナリオを記述する言語につかえる
語彙(XML世界におけるマークアップ文法のライブラリ)を
趣味で書いてみているところ。実行系はたぶんJavaで書くと思うけど。

712:デフォルトの名無しさん
03/05/30 07:31
行単位、スペース区切りでいいじゃん。


713:デフォルトの名無しさん
03/05/30 10:57
>>712
確かにそれが一番便利w
設定ファイルの読み込みや簡単なスクリプトでバッチ処理するときは最強。
しかし、より高機能なものを求めてコンパイラが欲しいのだから
そのような提案は無意味

714:フォールトの名無しさん
03/05/30 11:33
オブジェクト指向言語を作ってみたいのですが、良い教科書など
無いでしょうか?

一応、ドシロウトではなくて、括弧の使える四則演算電卓を作った
実績があります(C言語を用いて3ヶ月ほどで開発しました)。

その辺を踏まえて、オブジェクト指向言語の実装に関する、標準的
な書籍なりペーパーなりを紹介していただけないでしょうか?

また、このような自作言語に継続的な利用者が現れることを期待
するのですが、どのような場で、どの程度の進捗状況で発表すれ
ば良いのか見当がつきません。

成功した開発プロジェクトの実施スキームについて紹介していた
だけないでしょうか?

せっかく開発する予定の言語なので、できれば世界中の開発者に
使ってもらいたい、プログラミングの概念を根底から覆す提案を
したい、と言うのが私の願いです。


715:デフォルトの名無しさん
03/05/30 12:06
夢が大きくていいけどさ、まずは凝った作りじゃなくて、
もっと単純なコンパイラを練習として作ってみたら?
それならこのスレに情報もたくさんあるし。

716:デフォルトの名無しさん
03/05/30 12:09
>>714
がんがれ!!

717:デフォルトの名無しさん
03/05/30 12:39
>>714
Tiger本じゃだめ?

718:フォールトの名無しさん
03/05/30 13:05
>>717
>Tiger本じゃだめ?
ISBNコードわかります?


719:デフォルトの名無しさん
03/05/30 13:13
>>714
URLリンク(www.ruby-lang.org)
ソース嫁

720:フォールトの名無しさん
03/05/30 13:25
>>717
Webで検索したらそれらしい本「ISBN 0-521-58388-8」
が見つかりましたが、洋書のため書店での入手が難しく、
あきらめざる得ません(トイレで読むのに丁度よさそうな
レベルの本なのに残念です)。

日本で入手容易な、翻訳本など無いでしょうか?

>>719
このプロジェクトが終了してからじっくり読んでみたいと
思います。


721:デフォルトの名無しさん
03/05/30 13:35
>プログラミングの概念を根底から覆す提案
って何かな?別にプログラミング言語でなくても、日本語でも表現できるはず。

722:デフォルトの名無しさん
03/05/30 14:50
>>718
著者のページ:
URLリンク(www.cs.princeton.edu)

723:デフォルトの名無しさん
03/05/30 14:52
>>721
ま、そりゃそうだが、コードで語るってのもカコイイ


・・・かも知れないw。

724:フォールトの名無しさん
03/05/30 16:32
>>721

>>プログラミングの概念を根底から覆す提案
>って何かな?別にプログラミング言語でなくても、日本語でも表現できるはず。

まるで、具体的な計画を持たない香具師のように聞こえてしまう
じゃないか(はぁ)。。。この場で核心となるアイディアや
技術を披露するのは、未だ一寸早いと思う。私の考えに基づいた
言語仕様や実装方法が世間に受け入れられるためには、この
パラダイムギャップを埋めるための下地が不充分です。


725:_
03/05/30 16:33
URLリンク(homepage.mac.com)

726:デフォルトの名無しさん
03/05/30 16:40
>>724
と思うなら、まずプロトタイプでも作ってみるしかないんじゃないか。

727:デフォルトの名無しさん
03/05/30 20:28
>>724
どうせ、他に誰か1000人くらいは考えたことがある案だから気にするな。

728:デフォルトの名無しさん
03/05/31 01:55
FPGAの発想を応用して、VMを高速化

729:デフォルトの名無しさん
03/05/31 18:20
『システムソフトウェアプログラミング ― コンパイラの設計法と並行処理の基礎』
                         デイビッド クラーク (著)
ってのもあるぞ。個人的にはお世話になりました。

730:デフォルトの名無しさん
03/05/31 18:24
>>728
PS3

731:ろうひ男爵
03/06/05 02:06
>>721
自分的には、
今後はHTのおかげで、ディスクトップレベルででも
16CPU(物理的ではなくね)とか実装される

その後、256CPUとか実装されて、
ソフトウェアによって4CPUとか使われるようになる。

オブジェクト指向でつくられたプログラムで、
オブジェクト単位でCPUが割り振られるとか。
(すでにやってそうですね)

732:デフォルトの名無しさん
03/06/05 10:05
>>731
> オブジェクト指向でつくられたプログラムで、
> オブジェクト単位でCPUが割り振られるとか。
CPU間のスイッチが多すぎて激しく遅くなりそうな。

733:ろうひ男爵
03/06/05 12:17
>>732
メモリーもシェアメモリー部分だけ共有で、
1CPUあたり1GB位ずつ個別に持ってたりとか。
これ以上はすれ違いですね。スミマセン

734:デフォルトの名無しさん
03/06/10 15:09
lexの勉強をしています。
入力先の切り替えをするとき、
AT&T lexの場合は、input()とunput()を再定義する必要がありますが、
flexの場合、YY_INPUTの再定義だけで切り替えができます。
これは、flexが文字の返却をしないアルゴリズムで動作しているとのことでしょうか?

735:直リン
03/06/10 15:13
URLリンク(homepage.mac.com)

736:デフォルトの名無しさん
03/06/10 18:34
>>734
flexの実装については知らないけど、自前で文字バッファ持っていれば
unputはいらないでしょう。

lexical analyzerの本質からいって1文字先読みは避けられません。

737:734
03/06/10 19:42
>>736
そうですよね。
YY_INPUTは、flex側のバッファに文字列をコピーして渡すから、
後はflexの内部バッファの問題になるでしょうね。

確かに文字の返却なしってのは無理かw

738:デフォルトの名無しさん
03/06/10 23:48
>>731
> オブジェクト指向でつくられたプログラムで、
> オブジェクト単位でCPUが割り振られるとか。

ここのJ3Cなんか近いかも?
URLリンク(www.nk.rim.or.jp)

739:デフォルトの名無しさん
03/06/11 18:33
yaccを使おうとしたら、liby.aがないことに気がつく。
どうしてyaccが入っているのにliby.aがないのかと小一時間・・・
findしてもどこにもないし・・・馬犬 目 ぽ..._〆(゚▽゚*)

740:739
03/06/11 19:01
URLリンク(www.yuge.ac.jp)

> Linuxでは liby.a(Yacc用のダミーの yyerror,main)が提供されていません。
> そのため、自分で書く必要があります。

最初からないのね・・・

741:100人に1人
03/06/11 19:16
◎人の嫌がることをズケッと言うのはこんな奴!
<アスペルガー症候群(自閉症スペクトラム)←脳の機能的疾患(遺伝が要因)>
●変化を嫌う
URLリンク(web.kyoto-inet.or.jp)

●接し方のルールがわからず無邪気に周囲の人に対して迷惑なことをしてしまうことがある。人を傷つけるということには鈍感(相手の立場に立って考えられない)。
●パターン的行動、生真面目すぎて融通が利かない
 毎朝の通学電車では同じホームの同じ場所から、同じ時間の同じ号車に乗ることに決めていたりする。パターンを好むということは反復を厭わないことでもある。
●アスペルガー症候群の子どもは(大人も)感覚刺激に対して敏感。敏感さは聴覚、視覚、味覚、嗅覚、温痛覚などのいずれの感覚の敏感さもありえる(特に視覚が敏感)。
●アスペルガー症候群の子ども(大人も)は予測できないことや変化に対して苦痛を感じることが多い。
URLリンク(www.autism.jp)

●独り言を言うことが多い(考えていることを口に出す)
●物事をいつまでも同じにしておこうとする欲求が強く、そうでないと非常に不安。いわゆる「こだわり」。
●自発的に行動することが少なく、興味の幅が狭い
●物まねをしているような不自然な言語表現
●自閉症スペクトラム全体としては一万人に91人(およそ100人に1人)。
URLリンク(www.ypdc.net)

★自閉症スペクトラムの考え方(アスペルガーに至らない気質の偏りもある(遺伝性))
URLリンク(www.imaizumi-web.com)  
   
★アスペルガー症候群(自閉症スペクトラム)かどうかのテスト
URLリンク(twitwi.s10.xrea.com) 
URLリンク(www.geocities.co.jp)




742:デフォルトの名無しさん
03/06/11 19:46
>>740
liby.aは、あっても中身は無いも同然ですしね、昔は色々入っていたんでしょうか?
古いyaccを知っている人とかいるかな?

743:名無し@沢村
03/06/11 20:04
コンパイラやスクリプトエンジンをつくろうとしているおまいらよ、夢を見るのはいいことだぞ!!
おまいらよ、いろいろコンパイラやスクリプトエンジンの構想を練ってみろ?
多いに夢を見てみろ?
そしてつかの間の自己満足にひたってみろ?
おまいらよ、夢を見るのはいいことだぞ!!


744:デフォルトの名無しさん
03/06/11 20:26
RubyとかC#とかF#とかMixJuiceとか、そんなレベルじゃない、
もっとぶっ飛んだ未来の言語はありませんか?(´・ω・`)

745:デフォルトの名無しさん
03/06/11 20:43
unlambdaとかは?<ぶっとんだ

746:デフォルトの名無しさん
03/06/11 22:37
ということは、BrainFuckもか?

747:デフォルトの名無しさん
03/06/11 23:44
別に普通だが

748:デフォルトの名無しさん
03/06/12 00:19
>>739
こんなもんだっけ?msgには\n含まれてたかな?忘れてしまったが。

int main(int argc, char **argv)
{
return yyparse();
}

int yyerror(char *msg)
{
fprintf(stderr, "%s\n", msg);
}

もっともこんな手抜きのmainやyyerrorはいずれ捨てることになるんだから、
はじめからちゃんと自分で書きましょう。


749:デフォルトの名無しさん
03/06/12 00:26
-Dyyparse=main -Dyyerror=abort

750:739
03/06/12 19:42
>>748
liby.aは、740のリンク先から作成しますた。
確かに実用上は自分で書かないとだめぽ

ところで、lexにせよyaccにせよ、内部の挙動を考慮して使う必要があるのですね。
使い方を忘れると、訳が分からなくなりそう・・・

751:デフォルトの名無しさん
03/06/12 19:49
>>744
CPon

752:751
03/06/13 13:45
俺が書きこんだスレっていっつもレスが少なくなるんだけどなんでだろ?

753:デフォルトの名無しさん
03/06/13 21:40
>>752
CPonって何? 

754:デフォルトの名無しさん
03/06/13 21:49
751は妄想が過ぎるんだよ

755:751
03/06/13 23:04
>>753
宇宙のステルヴィアで使われているプログラミング言語です 多分 言語なのか怪しいけど

756:デフォルトの名無しさん
03/06/13 23:23
>>755
??????????????????????????????????????????????

757:751
03/06/13 23:33
>>756
ごめんなさい、くだらないことなんで気にしないでください

758:名無し@沢村
03/06/16 20:46
おまいらよ、脳内開発は終わったか?

759:デフォルトの名無しさん
03/06/17 09:28
>>751
ありゃ言語というより環境だろ。
>>752
笑えないから。

760:デフォルトの名無しさん
03/07/10 19:28
lex/yaccの宿題なのですが、ここで質問してもよいでしょうか?

761:デフォルトの名無しさん
03/07/10 22:38
>>760
丸投げはイヤンよ。

762:デフォルトの名無しさん
03/07/10 22:46
自作ファイラやエディタに言語を組み込みたいんだけど
どこかいい説明サイトないですか?

763:デフォルトの名無しさん
03/07/11 00:47
emacsのソース嫁

764:デフォルトの名無しさん
03/07/11 01:05
うーん、ここマジレスしていいとこなのか?

>>763
emacsは、特定のアプリケーションにLispが組み込んであるというより、
全体がLispシステムという構成でユーザにLisp環境を与えてるんだから
>>762向きじゃないだろう。

Tclを勉強するのがいいと思う。そもそも汎用の組み込み言語を目指して
発生したものだから。ラッキーなら>>762はTclをそのまま活用できるかも。

765:764
03/07/11 01:09
>>764
組み込み用言語

言いたかったのは、券売機とか洗濯機とかNC機に組み込むソフトじゃなくて、
アプリケーションに組み込むソフトってことね。後者は何て言えばいいんだっけ?

766:デフォルトの名無しさん
03/07/11 01:20
アプリ組み込み用言語処理系

・・・ダサ

767:760
03/07/11 02:16
それではお願いします
次の条件を満たすスタックマシンのオブジェクトコードを出力するコンパイラをlex/yaccを作成せよ。
・代入文のサポート
・if,if-else,whileのサポート
・入出力文のサポート
・ブロック構造体のサポート
・条件式のサポート
・固定変数のサポート
・int abc,xy[50];のような変数と配列の混在した宣言文が、何行でもファイルの先頭に書ける
・配列への代入、配列からの参照には、添字として数式が使える

という問題なのですが、下から2つの機能を除いたものは作ることができたのですが、
下の2つを追加するのにどこをいじればいいか全くわかりません。どなたかアドバイスお願いします。

768:760
03/07/11 02:17
以下プログラムです
lex

%%
"+" return(ADDOP);
"-" return(SUBOP);
"*" return(MULOP);
"/" return(DVIOP);
"(" return(LPAR);
")" return(RPAR);
"=" return(ASSIGN);
";" return(SEMI);
"{" return(LLPAR);
"}" return(RRPAR);
"<" return(LLLPAR);
">" return(RRRPAR);
"<=" return(REB);
">=" return(LEB);
"==" return(EQ);
"!=" return(NEQ);
"if" return(IF);
"put" return(PUT);
"get" return(GET);
"else" return(ELSE);
"while" return(WHILE);
"'" return(AP);
"," return(CM);
[0-9]+ {sscanf(yytext,"%d",&yylval);return(NUMBER);}
[a-z] {yylval=yytext[0]-97;return(ALPHABET);}
[ \t\n]+ ;
. {yylval=yytext[0];return(CHARACTER);}
%%

769:760
03/07/11 02:24
yacc-1

program :var_lists{kansu("INT",0,0);}
lists {table[0].q=hyo[number-1].add+hyo[number-1].size;
kansu("HL",0,0);for(i=0;i<codenum;i++){printf("%s %d%d\n",table[i].op,table[i].p,table[i].q);}}
;
var_lists :INT arrays SEMI
|var_lists KONMA INT arrays SEMI
;
arrays :var_decl{A=touroku(string);}
|arrays KONMA var_decl{A=touroku(string);}
;
var_decl:VARIABLE|VARIABLE KAKKO5 NUMBER KAKKO6;
var1 :/*empty*/{hyo[A].size=1;}
|KAKKO5 NUMBER KAKKO6{hyo[A].size=$2;}
;
lists :lists list
|list
;
list :VARIABLE{kansu("LA",0,sansyo(string));}
var2
ASSIGN expression SEMI{kansu("ST",0,0);}
|KAKKO3 lists KAKKO4
|if_prefix list{table[$1].q=codenum;}
|if_prefix list ELSE{$$=codenum;kansu("J",0,0);
table[$1].q=codenum;}
list{table[$4].q=codenum;}
|WHILE{$$=codenum;}
KAKKO1 condition KAKKO2{$$=codenum;kansu("FJ",0,0);}
list{kansu("J",0,$2);
table[$6].q=codenum;}

770:760
03/07/11 02:25
yacc-2
|GET KAKKO1 VARIABLE{kansu("LA",0,sansyo(string));}
var2{kansu("RI",0,0);}
KAKKO2 SEMI
|SEMI
;
if_prefix:IF KAKKO1 condition KAKKO2{$$=codenum;kansu("FJ",0,0);}
condition:expression YORIDAI expression{kansu("GI",0,0);}
|expression IJO expression{kansu("GE",0,0);}
|expression MIMAN expression{kansu("LT",0,0);}
|expression IKA expression{kansu("LE",0,0);}
|expression ONAJI expression{kansu("EQ",0,0);}
|expression TIGAU expression{kansu("NE",0,0);}
;
put_list:put_list KONMA put_parm
|put_parm
;
put_parm:expression {kansu("WRI",0,0);kansu("WLN",0,0);}
|CHARACTER{kansu("LC",0,$1);kansu("WRC",0,0);kansu("WLN",0,0);}
;
expression:expression WA expression{kansu("AD",0,0);}
|expression SA expression{kansu("SB",0,0);}
|expression SEKI expression{kansu("ML",0,0);}
|expression SYO expression{kansu("DV",0,0);}
|SA expression %prec UMINUS{kansu("NEG",0,0);}
|KAKKO1 expression KAKKO2{$$=$2;}
|NUMBER{kansu("LC",0,$1);}
|VARIABLE{kansu("LA",0,sansyo(string));}
|VARIABLE{kansu("LA",0,sansyo(string));}
KAKKO5 expression KAKKO6{kansu("LI",0,0);}
;

771:760
03/07/11 02:28
yacc-3
%%
#include "lex.yy.c"
struct{int address;char op[5];int p;int q;}table[100];
struct{char name[127];int soeji;int add;int size;}hyo[128];
int codenum=0;
int A,i,j;
void kansu(char x[], int y, int z){
strcpy(table[codenum].op,x);
table[codenum].p=y;
table[codenum].q=z;
codenum++;}
int number =0;
touroku(char a[]){
int b;
/*int c;
int start_add=0;*/
for(b=0;b<number;b++){
if(strcmp(hyo[b].name,a)==0){
printf("error\n");
return(NULL);}}
strcpy(hyo[number].name,a);
hyo[number].soeji=number;
hyo[number].add=hyo[number-1].add+hyo[number-1].size;
return(number++);}
sansyo(char d[]){
int e;
for(e=0;e<number;e++){
if(strcmp(hyo[e].name,d)==0){
return(hyo[e].add);}}
printf("no name\n");
return(NULL);}

772:名無し
03/07/12 17:58
URLリンク(www.experimentalstuff.com)
ここからJavaCCをDLしようとしても
The page you are looking for, /data/javacc-3.0.zip isn't here.
Sorry.
ってでてDLできないんですが

773:デフォルトの名無しさん
03/07/12 22:25
>>772
zipも、tar.gzも両方落とせるけど?

774:名無し
03/07/13 00:23
>>773
クッキーONにしたらDLできました

775:デフォルトの名無しさん
03/07/13 05:23
自己記述可能なオブジェクト指向の言語処理系で予約語や特殊記号の数が最小のものってどっかに転がってませんかね

776:_
03/07/13 05:25
URLリンク(homepage.mac.com)

777:デフォルトの名無しさん
03/07/13 12:51
>>775
scheme

778:通りすがり
03/07/14 07:23
因みに何で760はスルーなんですか?

779:通りすがりっていうか
03/07/14 07:24
多分760をここに誘導した奴なんだけどね。

780:デフォルトの名無しさん
03/07/14 11:45
>>778
まずインデントをどうにかしてくれんと読む気にならん。
ぱっと見、文法をどうにかしろよって感じだが。

781:山崎 渉
03/07/15 09:51

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄

782:デフォルトの名無しさん
03/07/17 13:25
>>767
アクションは後回しにして、まず文法だけ集中して考えてみたら。
ふつうはまず文法だけで書いて動かしてみて、正しくreductionが行なわれるかを確認
しますよね。

var_lists :INT arrays SEMI
|var_lists KONMA INT arrays SEMI
;

これだと int v, int x; なんていうのが通ってしまうけど…
かなり混乱してます。もうちょっと整理しよう。

783:760
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:デフォルトの名無しさん
03/07/23 20:24
>>785
1*2 の形の奴が単項演算子であるわけが無い。
*ptr の形の奴が2項演算子であるわけが無い。

よってどちらともいえないトークンではない

787:デフォルトの名無しさん
03/07/23 20:39
>>786
例が良くないだけで、問題は依然として解決していないと思うが?

MyClass::Member * a;

C++のこれは宣言?それとも乗算?

>>785
どれでもOK。標準はない。
俺だったら2を選ぶけど、それも参考程度にね。

788:785
03/07/23 22:40
>>786 & >>787
レスありがとうございます。

もしかして私の「字句解析」っていう言葉への認識って間違ってるのかなと思っちゃったのですが、
字句解析って「字面からわかる範囲で」文字列をトークンに切り出していく作業だと思っていたのですが
前後のトークンの状態などまで見るべきものなのでしょうか?
つまり単項か2項かというのは前後のトークンがわからなければ決定できないと思うのですが
そういう所まで見るのが普通なのでしょうか?
(前のトークンはともかく、後のトークンまで判別に使うとするとかなり難しい事になりますよね)
一般論という感じでいいのですが、ご教授ください。
よろしくお願いします。

789:デフォルトの名無しさん
03/07/23 22:55
>>788
> 字句解析って「字面からわかる範囲で」文字列をトークンに切り出していく作業だと思っていたのですが
それであってる。

> 前後のトークンの状態などまで見るべきものなのでしょうか?
そうする処理系もある。
ただそれは、純粋に字句解析だけでなく、一部構文解析も含んだ処理ということになる。

> つまり単項か2項かというのは前後のトークンがわからなければ決定できないと思うのですが
> そういう所まで見るのが普通なのでしょうか?
これも処理系によりけりで、>>785のどれになるかはいろいろ。

字句解析と構文解析の境界は、厳密に分かれているとは限らない。
今みたいに曖昧な場合や、いっそ「字句+構文解析」をしてしまうこともある。
逆に、あらかじめ曖昧さが生じないように言語を設計する場合もある。

・・・あんまり役に立ってないな、俺。

まぁ、生きた例を知りたいなら、解析器や言語処理系のソースを読むのが一番。

790:785
03/07/23 23:43
>>789
レスありがとうございます。
なるほど、厳密にパートを仕切る必要はないんですね。

>・・・あんまり役に立ってないな、俺。
そんな事ないです。日曜プログラムなので、周りに聞く人もいなくて
参考書籍とか雑誌とかもいくつか引っ張り出してきたりしてみたんですが、
疑問が出てきちゃったら正解かどうか確認する手段がないので、
こういう風に「それで間違いない」とか「それはこういう意味だよ」って答えてくれるだけで
とても助かります。ありがとうございました。


791:ろうひ男爵
03/07/24 07:53
>>785
ラベルが
AAA:
の場合にも、字句解析で1文字先読みして":"まで確認するものが多いですしね。
じぶんも、2)の中途半端な物にしておきます。


792:デフォルトの名無しさん
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:デフォルトの名無しさん
03/07/25 02:53
なぜおまえらLISPを使わんのだ

795:デフォルトの名無しさん
03/07/25 03:04
Lispを使うスレでないから

796:デフォルトの名無しさん
03/07/25 06:35
Lispはクソだから

797:デフォルトの名無しさん
03/07/25 13:57
括弧悪いから。

798:デフォルトの名無しさん
03/07/25 19:32
括弧(・∀・)イイ!

799:ろうひ男爵
03/07/25 21:14
>>797
ワタラ。

800:デフォルトの名無しさん
03/07/26 02:50
>>799
激しく同意

801:デフォルトの名無しさん
03/07/26 18:27
おまえらLISPは柔軟だからコンパイラやアセンブラとかを
LISP自身で書けるんだぞ。そもそも記号処理は得意分野だからな。
CやJavaで組むより簡単だろう。
実装側の言語に頼る量も最小で済むんだぞ。
なぜ使わんのだ。

802:デフォルトの名無しさん
03/07/26 18:28
>>797
括弧悪い?アホか。
括弧の量なんて些細な事でしかない。

803:デフォルトの名無しさん
03/07/27 08:34
>>802
通じて無いよこの人

804:デフォルトの名無しさん
03/07/27 14:24
Lisp厨うぜぇ。
括弧読みにくいんだよ。
いつまでもマイナー言語でオナニーしてろよ、ボケ!

805:デフォルトの名無しさん
03/07/27 15:47

Lisp厨以上に厨さを醸し出す>804

コイツ、ウザッ

806:デフォルトの名無しさん
03/07/28 07:32
>>801
Lispじゃなくても、コンパイラやアセンブラはその言語自身でかけるが・・・

807:デフォルトの名無しさん
03/07/28 07:32
ああ、すまん。より簡単だといいたいわけね。

本当にそうなの?

808:デフォルトの名無しさん
03/07/28 09:27
字句解析についての質問なんですが、
自前でトークンを切り出すコード
(もし先頭がアルファベットならwhileで延々読み込みみたいな)の実行速度と
lexで吐き出すコードの実行速度ではどちらが早いんでしょうか?



809:デフォルトの名無しさん
03/07/28 13:51
実装次第

810:棄教者 ◆egKIKYO7cg
03/07/28 14:50
>>808
オートマ車とマニュアル車とどっちが燃費いいかという命題に似ている。

811:デフォルトの名無しさん
03/07/28 18:24
>>808 のような質問をする人間にはマトモな実装が出来るわけが無い、と仮定すると
lex の吐き出すコードのがマシと思われ。

812:デフォルトの名無しさん
03/07/28 18:51
>>811の誤りは、自明なことをあらためて仮定したこと。


813:名無し@沢村
03/07/28 20:47
おまいらよ、コンパイラやスクリプトエンジンよりも、TVウェアをつくってみないか?

スレリンク(tech板)l50

814:808
03/07/28 21:53
実装次第ですが・・・ありがとうございました。

初めてlexのコード見たんですが
移植する時間も自信も・・・なので諦めました・・・
メモリも全然使えない環境ですし・・・

815:デフォルトの名無しさん
03/07/29 19:20
>>814
綴りの認識程度ならlex(というかDFA)は大袈裟な気がする。

僕だったら、連続するアルファベットと数字を連結して単語にし、事前に作っ
ておいたハッシュ表を索いておしまいにします。
ハッシュ表は、完全ハッシュ関数を作成するツール(GNU gperf)を使えば、
かなり小さくできるし。


816:デフォルトの名無しさん
03/07/29 23:49
>>808
最初で、しかも簡単な物でしたら、手で作ってみるのもいいのではないでしょうか。
それからlexを覚えた方が理解が深まりますし。

817:デフォルトの名無しさん
03/07/30 00:31
手作りするより、早めにlexの使い方を覚えた方が
後々楽な気がするけど。
まあ、時間に余裕があるなら。

818:デフォルトの名無しさん
03/07/30 12:19
801 ではないが,Lisp の場合
字句解析 -> 不要
構文解析 -> すでに終わってる
なので激しく楽なのは間違いない.本の章一つで
Lisp のサブセットやそのコンパイラの作成法が載るくらい.

819:デフォルトの名無しさん
03/07/30 23:08
LISP Scheme Pert8テンプレより

Lisp 言語処理系: CAMPUS LIsP, Lemon version
URLリンク(aten.aial.hiroshima-u.ac.jp)
Cコードによるわずか1000行の実装

ちなみにLispのマクロは字句解析と構文解析の間に作用するので、
別の言語のインタプリタをLisp上に作ることができる。
Paul GrahamのOn Lispという本(Web公開中)ではCommon Lisp上の
Prologインタプリタが解説されているし、
Richard Fateman教授のサイトには(おおっぴらには載せてないが)
Common Lisp上のMathematicaサブセットのインタプリタのソースが置いてある。
いずれもマクロを活用している。

おまけ bison, flexマニュアル和訳
fURLリンク(ftp.ascii.co.jp)

820:デフォルトの名無しさん
03/07/31 12:43
lisp厨は逝けよ。
lispのマクロで満足できるならこのスレには来るわけないんだからさ。


821:デフォルトの名無しさん
03/07/31 18:04
>>820
このスレで無駄に時間浪費した挙句、互換性のクソもない
コンパイラ・インタプリタなんぞ作って、いったい誰が使うのかな。

822:デフォルトの名無しさん
03/07/31 19:01
>>821
スレの存在そのものに疑義があるんなら立ち入ってくるなっつの。

823:デフォルトの名無しさん
03/08/01 02:36
>lispのマクロで満足できるならこのスレには来るわけないんだからさ。

lispのマクロを極めた人しかこんなことは言えないと思うのですが。

824:デフォルトの名無しさん
03/08/01 03:05
>>823
馬鹿だろ?
lispでマクロを極めようがどうしようが、んなことはフルスクラッチで
スクリプトエンジンを組みたい奴の欲求には答えられないっていってるの。
プロトタイプだけ作って満足するならともかく。
こういう場を読めないLispスノッブが大杉。


825:デフォルトの名無しさん
03/08/01 03:46
>>824
お前こそ馬鹿だろ?
lispのマクロがプロトタイプだけしか作れなくて
フルスクラッチの方がえらいみたいに考えてるところが。

826:デフォルトの名無しさん
03/08/01 05:23
824じゃないが

>> フルスクラッチの方がえらいみたいに考えてるところが。
> スクリプトエンジンを組みたい奴の欲求には答えられないっていってるの。

Lispでどんあ言語でも作ることができる何て言ってるヤシは、
Lispしかやったこと無いヤシ。

827:デフォルトの名無しさん
03/08/01 05:46
どんな言語でも大抵の言語は作れるよ

828:
03/08/01 07:34
flexで最後にマッチした文字列が入るyytextには'\0'は付加されるの?

URLリンク(guppy.eng.kagawa-u.ac.jp)
では付加されないから注意が必要と書いてるけど

URLリンク(www.geocities.co.jp)
とかのサンプルみてるといきなりstrcpy(yylval.name,yytext)見たいな感じのコードがあるんだけど。
strcpyはソース側がNULL文字終端じゃないといけないよね。
それとも自分が何か勘違いしてるのかな?教えてください。

829:デフォルトの名無しさん
03/08/01 11:39
>>827
そりゃアセンブラでも作ることはできるだろう。
ようはどれだけ簡単に作ることができるかだ

830:デフォルトの名無しさん
03/08/01 12:21
>>828
というかこれにぶっ飛んだよ。

%union{
    char   name[128];
}


831:デフォルトの名無しさん
03/08/01 13:29
>>826
Lispスノッブ大杉って,漏れには数人しか見えないが….
コンパイラやスクリプトエンジン書くのに言語やツールなんか関係ねーだろう.
フルスクラッチがいいなら Lex も Yacc も使わずに全部手でかけばいいじゃん.


832:デフォルトの名無しさん
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
03/08/01 14:07
まだ、Schemeではプログラムをあまり書いていないので、
先入観も含んじゃっています。

834:828
03/08/01 14:14
>>830

すいません、まだ勉強始めたばっかりでなんでぶっ飛んだのかわかりません。
あとflexは自動的にヌル終端文字列にしてくれるんですか?

835:デフォルトの名無しさん
03/08/01 14:21
>>821
> 互換性のクソもないコンパイラ・インタプリタなんぞ作って、いったい誰が使うのかな。

このスレで書いてはならない事を書いたね。


836:デフォルトの名無しさん
03/08/01 18:47
ごめん

837:デフォルトの名無しさん
03/08/01 18:55
>>836
素直だ。

838:デフォルトの名無しさん
03/08/01 19:00
>>834
%unionってスタックの要素になるんだが、それを128byteとる豪儀(藁)さに。
終端はしないはず。

839:
03/08/01 21:03
>>838
おお、どうもありがとう。

840:デフォルトの名無しさん
03/08/01 21:31
すまん、されてるっぽいよ。

841:デフォルトの名無しさん
03/08/01 23:52
>>832 なんで Lisp 厨を刺激しそうなことを書くかね・・・。
とりあえず、フォローしておこう。ちょっと検索したけど Scheme 用の
LALR パーサジェネレータとかある。資料も英語なら本が何冊もオンライン
で読めるみたいだし。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4934日前に更新/200 KB
担当:undef