「コンパイラ・スクリプトエンジン」相談室13 at TECH
[2ch|▼Menu]
[前50を表示]
400:345
09/08/16 01:27:27
>>391
え、Pythonにもevalあるんですか?!うーむ
どちらが真実かは、結局は自分で調べなさいということですな。

401:デフォルトの名無しさん
09/08/16 01:36:23
python -c 'print eval("1+1")'

402:345
09/08/16 01:52:09
>>401
再現しますた。わざわざありがトン。

403:デフォルトの名無しさん
09/08/16 02:37:35
>>394
LISPerは自分用のがあるから
他人の糞LISPなんて使わない


404:デフォルトの名無しさん
09/08/16 02:50:00
>>403
というか、そんな結論ありきな考え方をするやつなら
そもそもこんなスレに来る必要がないわけだが。

405:デフォルトの名無しさん
09/08/16 08:26:25
> データがFILOで済むというのも嘘。
> 辞書に登録したら不必要になる順序はプログラム次第。

少なくとも伝統的なFORTHなら辞書は一方向リンクトリストで最後に
登録されたものから順につながってるし、最後に登録されたワードを
グローバルなワークエリアが指している。
FORGETワードは、特定のワード以降に登録されたワードを全部捨てて
しまう。

そういう構造だから、基本的にGCはない。

406:デフォルトの名無しさん
09/08/17 10:10:39
>>394
ISLISP

407:デフォルトの名無しさん
09/08/26 22:10:05
ABAPのEBNFください

408:デフォルトの名無しさん
09/08/31 11:13:52
ANTLRで苦戦していて質問したいのですが、このスレでいいでしょうか?
もしくは専用スレを立てる?


409:デフォルトの名無しさん
09/08/31 11:40:06
このスレでいい。

410:408
09/08/31 11:58:13
お言葉に甘えて。

ng
  : n=TOKEN (v=INT|v=FLOAT)
    -> ^(PARAM $n $v)
  ;

ok
  : n=TOKEN v=(INT|FLOAT)
    -> ^(PARAM $n $v)
  ;

ngルールみたいな書き方はダメでしょうか?
antlrは通るのですが、C言語からそれを呼び出すと
セグメンテーションフォールトします。


411:408
09/08/31 11:59:43
ごめん。ngルールとokルールが逆だった。
v=(INT|FLOAT)がNGで(v=INT|V=FLOAT)がOK.
ANTLR的にv=(INT|FLOAT)という書き方はNGなのでしょうか?


412:デフォルトの名無しさん
09/09/06 21:10:45
出来ればツール頼らずに
手続き型言語作りたいんだけど
どのくらい大変なん


413:デフォルトの名無しさん
09/09/06 21:16:35
コンパイラもアセンブラもリンカもエディタもツールですよ・・・

414:デフォルトの名無しさん
09/09/06 21:40:42
Brainfuckならパンチカード手打ちしてもできるんだろうな

415:デフォルトの名無しさん
09/09/06 21:42:28
TinyBASICくらいの規模なら机上でいけるんじゃないかな

416:デフォルトの名無しさん
09/09/06 21:49:12
ツールってyaccとかlexのことか?
なくても大差ないと思うよ

417:デフォルトの名無しさん
09/09/06 21:57:54
>>412
LLで混乱しない文法なら問題ないんじゃないの?
このスレだったと思うけどμplanとかpascalの構文なら自己記述できるし


418:デフォルトの名無しさん
09/09/06 22:00:52
>>412
どういうコードに落とし込むかってあたりが問題になる位で落としやすいVMを設計すれば32Kワードもありゃ言語コンパイラは書ける
UCSD p-systemとかが実際そんなものだ

案ずるより産むが易しってあたりの言語なら悩む前に書き始めてみればいい
コード公開してもいいのなら行き詰まってから助けを求めに此処に戻ってこい


419:デフォルトの名無しさん
09/09/06 22:09:00
いまどきこだわることはないと思うが、
たいがいの言語ならちょいと工夫すればだいたいトップダウンパーザで書ける。

420:デフォルトの名無しさん
09/09/06 22:10:26
>>412
PerlやRubyで書けば、素で描いてもまあ2週間くらいで。

421:デフォルトの名無しさん
09/09/06 23:56:56
LISPだと数分〜数時間

422:デフォルトの名無しさん
09/09/07 00:03:58
yane lispおすすぬ

423:デフォルトの名無しさん
09/09/07 00:42:09
Lisperあっち行け

424:デフォルトの名無しさん
09/09/07 12:57:23
おおっ
わからない単語がいっぱいでてきた
たくさんレスありがとう

>>416
そういうことです

>>418
Lispなら作れたからアルゴリズムで行き詰る事は多分無いんだけど
Lispに比べると全然ソース量が桁違いになりそうでヘタレてる・・・

>>420
2週間!!
以外と速い
頑張ってみます

425:デフォルトの名無しさん
09/09/07 20:43:59
Lispすげー

426:デフォルトの名無しさん
09/09/08 07:46:38
Lisp作れたならその上でマクロ書けば数日で手続き型言語作れないか?

427:デフォルトの名無しさん
09/09/08 10:19:06
LISPのインタプリタの作り方ならLISPの入門書の最後に例題で出ているレベル
JavaとかのGC機能が前提の言語ならそんなに難しくないはず
コンパイラなら知らん

LISPのインタプリタと手続き型言語のインタプリタはつくりがまったく違うと思うけどなあ

428:デフォルトの名無しさん
09/09/08 11:44:23
↓このスレの住民なら1レス以内に作れるレベル

429:デフォルトの名無しさん
09/09/08 11:57:33
LISPで全部できると思うならそうすればいい。
ただ、なぜいつまで経ってもLISP系が主要プログラミング言語にならないかの理由についても考慮すべき。

>>424
パーサー、構文木構築、構文木消化・変換、出力を順番に作って中間出力を目で確認する。
中間出力はPerlならData::Dumper、RubyならYAMLで。
この辺がC/C++ではしち面倒くさすぎてスクリプト言語でコンパイラを実装する理由。
よほど大規模なマイ言語のスクリプトを構築しない限りは速度面の不満も出ないしね。

430:デフォルトの名無しさん
09/09/08 12:03:55
>>429
C++はSTLとかを使えば面倒な部分がなくなってスプリクト言語で実装するレベルにならない?

431:デフォルトの名無しさん
09/09/08 12:20:47
>>424
Lispの処理系を書いたことがあるってことは、コンパイラ理論は知っているんだよな?

インタプリタ、中間コード吐いてVM上で動かす、ネイティブバイナリ吐く、
と色々パターンがあるが、基本はまず、再起下降パーサー書いて抽象構文木に
落として、実行するインタプリタを書く。それが出来たら(中間表現に落として
最適化して)コード生成。

432:デフォルトの名無しさん
09/09/08 12:33:59
>>430
C++のSTLでYAML並みの読み書き柔軟性得るのにどれだけコストが必要か考えてみて。

433:デフォルトの名無しさん
09/09/08 14:11:55
boost:serialization ってものも

434:デフォルトの名無しさん
09/09/08 14:19:38
ruby信者は痛いので気づいたらそれ以降触らないようにしてる

435:デフォルトの名無しさん
09/09/08 14:33:52
大体IRを一々ファイルに書き出す必要もねーだろw
Pretty-printerを書いとけば十分

436:デフォルトの名無しさん
09/09/08 16:19:41
>>432
シリアライゼイションを覚えたての子供ですね?

437:デフォルトの名無しさん
09/09/08 16:33:32
ANTLR3でトークンとしてヒットするけど出力しないトークンはどうやって定義すれば良いのでしょうか。
このTOKENでDQを無視してSTRINGだけツリーパーサーで欲しいのですが…
SKIP()はセグメンテーションフォールトで落ちました.

TOKEN
: DQ STRING DQ ;

fragment
DQ : '"' ;

fragment
STRING : ( ES | ~('\\'|'"') )* ;

fragment
ES
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\');


438:デフォルトの名無しさん
09/09/11 21:46:52
ADD 3 TO 4

という文があった場合
BNFするとしたら、どうするのがカッコいいですか?

439:デフォルトの名無しさん
09/09/11 21:52:46
<文> ::= "ADD" "3" "TO" "4"

440:デフォルトの名無しさん
09/09/11 21:57:39
>>439
ATSにする場合どうすればいいの?

441:デフォルトの名無しさん
09/09/11 22:39:18
キンコンキンコンキンコンキンコンキンコンキンコン

442:デフォルトの名無しさん
09/09/14 19:04:29
AST? ATS?

443:デフォルトの名無しさん
09/09/14 20:50:35
>>442
AST
AST
AST
たすけてください

444:デフォルトの名無しさん
09/09/14 20:53:29
>>439みたいな文法だったらツリーにする必要なくね

445:デフォルトの名無しさん
09/09/14 21:01:21
だね。
リスト(線形)でじゅうぶん。

446:デフォルトの名無しさん
09/09/14 21:02:35
自然言語を再現したいのか
本当に "ADD" <NUM> "TO" <NUM> なのかでずいぶん違うよな

447:デフォルトの名無しさん
09/09/14 21:17:13
"ADD" <NUM> "TO" <NUM>
なのです

その跡にFROMとかつくかもしれないのです
お願いします

448:デフォルトの名無しさん
09/09/14 21:23:58
それでも再帰構造さえなければツリーはいらん

449:デフォルトの名無しさん
09/09/14 21:30:25
でも、その後学のために
作ってみたいのです

お願いします

450:デフォルトの名無しさん
09/09/14 21:31:10
だから構文そのものがツリー構造じゃないからツリーにならないんだって

451:デフォルトの名無しさん
09/09/14 21:38:38
>>450
COBOLみたいな構文もツリー構造じゃないから無理?

452:デフォルトの名無しさん
09/09/14 23:39:27
COBOLに式あったっけかな。
要するに、
<式> :== <式> + <式>
とか
<文> :== <IF文> | ...
<IF文> :== "IF" <式> "THEN" <文> ("ELSIF" <文>)* ("ELSE" <文>)? "FI"
みたいな再帰的な構文があると、再帰的なデータ構造でないと
いけないわけで、木が必要になる。

アセンブラみたいなのだったらリスト(線形)で十分。
SQLってどうなの? 識者求む。

453:デフォルトの名無しさん
09/09/15 02:07:23
副問合せ句とかが在るから、再帰じゃないと表現できないんじゃないかな。

ところで、ORACLEのマニュアルにある図ってなんって言ったっけ?
BNFが図になってる奴。

454:デフォルトの名無しさん
09/09/15 03:14:36
構文図

455:デフォルトの名無しさん
09/09/15 10:36:28
Expression ::= "ADD" Factor "TO" Factor
Factor ::= Num | "(" Expression ")"
Num ::= "0".."9"+
かもしれん。
これならツリーになる?

456:デフォルトの名無しさん
09/09/15 10:49:33
AND, OR, UNION等は再帰で定義するから木で表す。

457:デフォルトの名無しさん
09/09/15 11:25:21
>>455
その構文のインスタンスはツリーに出来る。
その構文そのものは再帰があってDAGになる。

458:デフォルトの名無しさん
09/09/17 02:22:52
デザインパターンを駆使してコンパイラを自作しています。

・字句解析=Chain Of Responsibility
・構文解析=Interpreter

のように作っていてうまくいっているのですが、
意味解析はどのパターンを使えばいいでしょうか?
どこかのサイトでVisitorを使うとか見たような気がするのですが。


459:デフォルトの名無しさん
09/09/17 08:28:50
>>458
先に仕様があってそれから設計を施していくわけで、
手段と目的を混同しちゃいかん。
誰も君のコンパイラの設計がどうなってるのかなんて知らんだろ。

460:デフォルトの名無しさん
09/09/17 09:34:27
つか, 関数型言語なら別の選択あるだろうけど,
手続き型言語の場合, パーサジェネレータ使った方が
早い処理系ができるだろうに………


461:デフォルトの名無しさん
09/09/17 10:02:39
>>460
それは文法によるだろう。

言語処理系の書きやすさを第一に考えて言語を設計した場合、
手書きの再帰下降パーサでも十二分な速度が出ることはD言語などで実証されている。

462:デフォルトの名無しさん
09/09/17 10:08:28
Interpreterで構文解析っておかしいだろ
どういう設計なのか知らんがVisitorとInterpreterは相互変換できるからどっちかに統一するべき

463:デフォルトの名無しさん
09/09/17 12:13:30
性能はむしろ手書きのパーサのほうが出る。

手書きパーサが不利で、パーサジェネレータが有利なのは以下のような点。
・構文規則とアクションがすっきり分離させて記述できる
・LL(1) に収まらない文法を記述するためのテクニックに煩わされない
・規則をあれこれ変更するのが簡単

あと現代的なテクニックをかじりたいならパーサコンビネータライブラリとか使ってみたら?

464:デフォルトの名無しさん
09/09/17 17:32:14
Scalaの勉強していてパーサコンビネータを触っていたんだけど、
電卓の次に思い浮かぶ使い道がコンパイラとかインタプリタになってしまう。
その間ぐらいで、手ごろな練習のネタって無いものかなぁ?

465:デフォルトの名無しさん
09/09/17 18:49:33
>>464

発想の出発点を見直せば、その人なりのネタは見つけられると思うけどね。

自分だと、最近はRubyでツール作りする機会が多いから、そのコマンド引数
(サブコマンドやオプション指定の組み合わせ)を解釈するのにRaccを使うことがある。
他にも差分記述のある知識表現にPrologのDCGで簡単なDSL(ドメイン固有言語)を作ってみたり、
同じ発想で差分記述のできるテストデータ記述言語をRaccで記述したり。
極端な例だと、Webアプリのプロトタイプ開発で、画面遷移を制御するためにyaccを使い、
画面(フォーム)定義言語もyaccで実装するというマニアックな設計をしたことも。

要は「パーサ」イコール「言語処理系」という思い込みを捨て、単なる再帰的な
データ構造の処理に適した「道具」にすぎないと考えれるのがいいのではないかと思う。

466:デフォルトの名無しさん
09/09/17 18:52:17
>>465
オレだったらそういう用途の処理用データはXMLやらYAMLやらで定義ちゃうだろうな。

467:デフォルトの名無しさん
09/09/17 19:15:33
>>465
おまえUNIX板のyacc&lexスレの>>120だろ

468:デフォルトの名無しさん
09/09/17 20:08:43
>>464
・ ラムダ式の使える関数電卓
・ 文字列がメールアドレスとして正しいかチェックするプログラム(コメントのネストにも対応)
・ 装飾をネストできる独自Wiki
・ テンプレートエンジン

469:465
09/09/17 20:21:28
>>466

最初は同じ事を考えていたんだ。でも、自分一人で作る/使うぶんにはいいんだけど、
他のメンバが使う/使わせることを考えると、エラー処理(構文検査)も考えなけりゃならない。
XMLならDTDやRELAX-NG、YAMLならKawflyみたいなスキーマ定義が必要になる。
そこまでするくらいなら、汎用パーザを使うのがいいんじゃないかと、最終的に判断した。
パーザで適切な構文木さえ構築してしまえば、あとはVisitorパターンを駆使することで、
XMLでもYAMLでも(Latexでも....)出力形式の切り替えは簡単な処理で実現できるからね。

>>467

あたり

470:デフォルトの名無しさん
09/09/17 21:00:25
>>465
なるほど、使い道としては面白いですね。ちょうど今、コマンドライン解析のあたりやってるし。
でも、勉強としてやってるんで、これが正解ってのがあるほうがいいです。
仕様も自分で考えるんだと、パースしやすいような仕様にしてしまうんで。

>>468
メールアドレスって、foo@examples.comだけじゃなく、"foo" <foo@examples.com>, …のほうですよね。
それはやりがいがありそうなネタですね。

471:デフォルトの名無しさん
09/09/17 21:10:01
>>470
・PCRE(Perl 5 Compatible Regular Expression Library)の正規表現のパーズ。
・POSIX shellの文法のパーズ。



472:デフォルトの名無しさん
09/09/17 23:33:28
>>462
Interpreterパターンって構文解析の為のパターンじゃないの?

473:デフォルトの名無しさん
09/09/17 23:39:58
InterpreterはASTのノードに自分自身と子の評価を行う処理を直接埋め込むことで
ASTをそのまま実行するパターンだよ
あらかじめ構文解析を行ってASTを作っておく必要がある

474:デフォルトの名無しさん
09/09/19 03:37:23
Wikipedia項目リンク

ウィキペディアには
Interpreter パターン = 構文解析のために、文法規則を反映するクラス構造を作る。
って書いてあるんだけど。

475:デフォルトの名無しさん
09/09/19 04:51:05
デザインパターンとか大層なもんじゃないでしょ

476:デフォルトの名無しさん
09/09/19 05:27:58
Interpreterパターンが構文解析のために利用されるのは正しい表現だと思われ。
あらかじめ構文規則に沿ってオブジェクトを配置する必要があるのは事実だけど、
それは構文解析とは別の話しだし、(yaccみたいな)パーザジェネレータも同じだから。(>>473)

最近はデザインパターンから入る若者が多いから、ごっちゃにして考えやすいけどね。
まあ、デーザインパターンなんて大層なもんじゃないという意見に同意するよ。(>>775)


477:デフォルトの名無しさん
09/09/19 06:03:46
>>462=473=476?
君はたぶんいろいろと間違って理解してるからGOF本をしっかり読みなおした方がいいよ
確かにデザインパターンは大層なものじゃないとは思うが、間違った理解は周りの人を
混乱させてむしろ害悪だから

478:デフォルトの名無しさん
09/09/19 06:12:44
>>477
具体的にドゾー

479:デフォルトの名無しさん
09/09/19 06:44:13
>>478
>VisitorとInterpreterは相互変換できる
できない
VisitorとInterpreterでは全く目的が異なる

>InterpreterはASTのノードに自分自身と子の評価を行う処理を直接埋め込むことで
>ASTをそのまま実行するパターンだよ
処理を直接埋め込むこと、そのまま実行することは必須ではない
(GOF本「実装」欄の2.を参照)

>あらかじめ構文解析を行ってASTを作っておく必要がある
ASTの生成方法までは定義されていないが、Interpreterパターンと言った場合、
(ASTを生成する)Clientオブジェクトもパターンの構成要素に含めて考える方が一般的
(GOF本「構成要素」欄と「実装」欄の1.を参照)

480:476,478
09/09/19 07:03:29
>>477
自分は>>462,473じゃないヨ

>>479
まったく、その通りだね

ところで、GOF本のアレをInterpreterパターンと呼ぶのはどう思うかな?>>all
自分にはインタプリタという言葉のニュアンスから違和感があるんだけど

と、スレらしい話題に戻してみる

481:デフォルトの名無しさん
09/09/19 13:20:31
逆。Parsingにinterpreter patternってのは単純な場合のみ。
ASTインスタンスの生成を行うのは、interpreter patternの仕事だけど、
(ASTインスタンス生成は解釈の特殊な形態の一つ)
parsingそのものはInterpreter patternの仕事じゃない。
単純な例だと一体化しているので、混同しているケースが結構多い。
日本語版wikipediaの記述がその例。(これは古い英語版を元にしている)

GoFより
> The pattern doesn't address parsing. When the grammar is very complex,
> other techniques (such as a parser) are more appropriate.


482:デフォルトの名無しさん
09/09/19 18:12:25
GOFの神格化進んでいるんだね。怖いね。

483:デフォルトの名無しさん
09/09/19 18:24:39
必要以上に貶めている人がいるから
訂正してくれてるだけでしょ?

484:デフォルトの名無しさん
09/09/19 20:17:37
ヤレヤレ

485:デフォルトの名無しさん
09/09/23 08:13:49
形式言語と正規表現って別物ですか?
同じものですか?

486:デフォルトの名無しさん
09/09/23 08:33:39
>>485

正規表現は形式言語の一種である、という解釈でだいたい合っていると思う。
C言語はプログラミング言語の一種である、と同じ解釈ね。
あと、そういう言い方をするなら、正規表現ではなく正規言語だろうね。

487:デフォルトの名無しさん
09/09/23 08:48:28
正規表現と正規言語は別のものだが?

488:デフォルトの名無しさん
09/09/23 09:02:34
正規表現と正規言語と正規文法はどういう関係ですか?
コンパイラの理論の基になっているのは生成文法なんですか?
もし、チョムスキーが生成文法を発表しなかった世界があったら
その世界で使われているコンパイラはどんな物だと思いますか?
COBOLとFORTRUNとlispですか?


489:デフォルトの名無しさん
09/09/23 09:11:11
ちったあ自分で調べろ

490:デフォルトの名無しさん
09/09/23 10:16:49
古い変な本しか手に入らないか
周囲に変なことを吹き込む人がいるか
釣りか

なんにせよ調べる気はあるまい

491:デフォルトの名無しさん
09/09/23 10:20:38
それにしてもチョムスキーのこんな持ち上げ方って久々に見たw

492:デフォルトの名無しさん
09/09/23 10:22:29
調べる=知ってる人に聞く
じゃないの?
本やネットってゴミ情報が多すぎて
知りたい情報にたどりつくまで
手間と時間がかかりすぎるからさ
知ってる人にズバリ答えてもらうのが一番なのよ

493:デフォルトの名無しさん
09/09/23 10:36:03
チョムスキー理論の理解こそが自然言語処理実現の第一歩だぁー!!と
必死になって文献を読みあさっていた、過去の自分を思い出すw

494:デフォルトの名無しさん
09/09/23 11:51:45
文字列が長すぎて
strlen()が'\0'にたどりつくまで
手間と時間がかかりすぎる
って話を思い出した

495:デフォルトの名無しさん
09/09/23 15:01:14
こんなこと如きで他人に苦労させるなカス >488
自分で勉強するつもりが無いのならこんなスレ覗くなボケ
URLリンク(www.bing.com)
URLリンク(www.google.co.jp)


496:デフォルトの名無しさん
09/09/23 15:05:34
と思ったが、最後のは少し興味あるな。
チョムスキーが発表しなくても、同様の概念(TMとか再帰とか翻訳とか形式体系とか)はあるから
結局は同じようなものに落ち着くような気がする。

497:デフォルトの名無しさん
09/09/23 15:43:24
BNF自体はチョムスキーの発明でもないしな

498:デフォルトの名無しさん
09/09/23 15:56:41
インド人だっけ?凄いよね。

499:デフォルトの名無しさん
09/09/23 16:02:39
誰がインド人?

500:デフォルトの名無しさん
09/09/23 16:06:52
Wikipedia項目リンク

501:デフォルトの名無しさん
09/09/23 17:21:39
大体が↓のような感じで構文解析までが行われると思うのですが、

ソースコード → 字句解析 → トークンリスト → 構文解析 → 構文木

トークンリストはトークンクラスのリストと表せますが、
構文木はどのような形になると思いますか?



502:デフォルトの名無しさん
09/09/23 17:36:26
構文要素クラスの木構造

503:デフォルトの名無しさん
09/09/23 17:38:26
開始記号クラスかな

504:デフォルトの名無しさん
09/09/23 17:45:32
このあいだまでは「パニーニ」と表記してた気がするが、最近は「パーニニ」なのか。
昔インド人の先生に尋ねたら俺の耳にはパニニーと聞こえたが。

てかBNFはバッカス(と、本人はあまり乗り気でないようだがナウア)の功績だろ一応はやっぱ。

505:デフォルトの名無しさん
09/09/23 20:01:10
インド人の発音は独特だから

506:デフォルトの名無しさん
09/09/24 00:29:14
日本人の発音の方がはるかに独特です

507:デフォルトの名無しさん
09/09/24 00:35:57
かもしれぬ
インド人と言っても様々だ
が、日本人がインド人の発音を聴き取るのは慣れないと無理
驚くというか途方に暮れるぞ

508:デフォルトの名無しさん
09/09/24 01:41:42
詳しく!

509:デフォルトの名無しさん
09/09/24 02:38:16
>>507
そこでインド人を右へ


510:デフォルトの名無しさん
09/09/24 05:56:31
なるほど。たしかみてみよう

511:デフォルトの名無しさん
09/09/24 14:00:01
確かめた結果、
ザンギュラのスーパーウリアッ上
でした

512:デフォルトの名無しさん
09/09/24 14:23:33
ダトル・オブ・ぷよぷよ

513:デフォルトの名無しさん
09/09/25 20:00:42
ゆとり教育は嘆かわしい。
中学生の息子の机に数学のノートが開いていた。
なんと、数式にビックリマークを付けて遊んでいた。
出てくる数字はほとんどが1桁の整数のかけ算。
しかも答が間違ってる。
小学校の九九の復習にもなってない。
本当に嘆かわしい...。

514:デフォルトの名無しさん
09/09/25 20:16:35
>>513
ゆとり教育でなければ九九ができるようになるはずだという発想がすでにおかしい
人任せにしてないで、自分で教えてあげたら?
多分、どっかでつまずいてそのままになってるんだと思うよ。

515:デフォルトの名無しさん
09/09/25 20:22:54
>>514
ネタにマジレス、カコワルイ。
ここは息子インタプリタが自然数の階乗をパースして計算していると考えるんだ。

516:デフォルトの名無しさん
09/09/25 21:06:42
ネタだと気付かないところがすでにおかしい

517:デフォルトの名無しさん
09/09/25 22:11:00
不思議なインド人に対抗するには
九九じゃなくて二五六二五六やらせるべき

518:デフォルトの名無しさん
09/09/25 22:30:37
>>513を読んで想像すべきだった状況の例
3!×5!=720

519:デフォルトの名無しさん
09/09/25 22:40:00
>>513って親がゆとり世代だった、ってオチ?

520:デフォルトの名無しさん
09/09/25 22:40:49
階乗は習ってねーや

521:デフォルトの名無しさん
09/09/26 00:53:30
「ジョークを解説するのはカエルを解剖するのと似ている。
解剖されたカエルには誰も興味を示さないし、カエルは死ぬ」

522:デフォルトの名無しさん
09/09/26 01:15:17
なんかえらく主観的な格言だなぁ
説得力のある文体に騙されそうになるけど

523:デフォルトの名無しさん
09/09/26 01:25:10
解剖したカエルは、フランス人スタッフがおいしく頂きました。

524:デフォルトの名無しさん
09/09/26 08:36:52
最初からコンテキストもなにもなしにジョークを投下するやつが悪い

525:デフォルトの名無しさん
09/09/26 23:45:56
antlrworksで正規表現の

[0-9]{1,16}

ってどうやって書けばいいの?

526:デフォルトの名無しさん
09/09/27 04:32:51
日本ではコンパイラの研究ってあんまはやってないの?
有名な研究室ってどこ?

527:デフォルトの名無しさん
09/09/27 09:31:33
>>526
コンパイラ site:ac.jp で検索してみるとか。

528:デフォルトの名無しさん
09/10/01 23:19:37
タイガーブックの最新版ってどうよ?
今月末に出るけど

529:デフォルトの名無しさん
09/10/02 20:43:42
どうよ?だと?
自分で買ってきて報告しろやヴぉけ

530:デフォルトの名無しさん
09/10/02 22:48:49
無駄無駄
どうよ?厨はいつだって人から貰うだけ


531:デフォルトの名無しさん
09/10/03 00:06:04
俺の上腕二頭筋どうよ?

532:デフォルトの名無しさん
09/10/03 00:14:32
すごく・・・ぷよぷよです・・・

533:デフォルトの名無しさん
09/10/03 05:55:58
タイガーブックがついに邦訳されて今月末に出版されるよ

534:デフォルトの名無しさん
09/10/03 07:23:00
無駄無駄
されるよ?厨はいつだって人から貰うだけ

535:デフォルトの名無しさん
09/10/03 12:42:47
preccsより腐ってない
フリーのプロトコルコンパイラ知りませんか?

536:デフォルトの名無しさん
09/10/03 14:04:03
尻いりませんか?だと?
いいのかい?ホイホイ突いちまって

537:デフォルトの名無しさん
09/10/03 14:39:57
>>535

preccsのドコが腐っていると感じたのかな?
自分は初見だったのでググってみて、CSPというかOccamの実装という印象を持った。
そのうえで、予想される「腐って」いそうな点をあげてみる。(実際には触っていないヨ)
・コンパイラの実装がバグだらけ
・マルチスレッディングに対応していない
・デバッグが難しい
・プロトコル記述(状態遷移)が直感的ではない
・メッセージ処理機能が不十分
・プロトコル定義の網羅性に欠ける

あと、このスレよりもネットワークプログラミングスレ向きな話題かも。
このスレだと「自分の好みに合ったコンパイラを作れ!」なレスが中心になってしまう気がする。

538:デフォルトの名無しさん
09/10/04 04:03:23
実質パーサの話題に終始してるがな
コンパイラですらない
インタプリタでもない


539:デフォルトの名無しさん
09/10/04 10:59:49
じゃ、話題の提供ヨロシク

540:デフォルトの名無しさん
09/10/05 13:04:03
Pythonでコマンドを作って、
自作のスクリプトでそのコマンドを呼び出すという仕組みで処理系を構築してる。
すでにある程度動いてるんだが、
現状手動で作成してるコマンドの一覧をPythonのプログラム側からどうやって吐き出そうかなと考えているところ。
sed/awkあたりで簡単に切り貼りできるような形式を用意できるといいかなぁ。
できればコマンドのマニュアルも一緒に生成できるといいんだが。

現在固定になってるコマンド一覧は実際にはXMLファイルで、
コンパイラがデシリアライズの形で一括で読み込める仕組みにしている。
XMLを手作業で編集するのはしんどいので、シリアライズで書き出す簡単なプログラムを用意して、それを毎回手で編集してる。

541:デフォルトの名無しさん
09/10/05 13:38:45
>>540
JavaDocみたいに定型のコメントを書くのはどうですか?

542:デフォルトの名無しさん
09/10/05 14:02:58
pydoc

543:デフォルトの名無しさん
09/10/06 12:51:07
実装には命令型言語より関数型言語の方が向いているのかな
Pugsが出てからずいぶん経つのにPerl6まだ出ない

544:デフォルトの名無しさん
09/10/06 13:45:27
>>543
そんな漠然としたレベルの話だと、好みでとしかいいようがないんじゃ。
ただ、Haskellの論理的な記述能力は空恐ろしいものがあるな。
例えばYAMLパーサのリファレンス実装はHaskell製だ。
HTMLの仕様書用意されてはいるが仕様の詳細までは網羅されておらず、参考程度にしかならない。
で、ソースコードみてみたら、ほとんどBNF式そのまんま。
これをネイティブで解釈するんかHaskellは……。

545:デフォルトの名無しさん
09/10/06 13:51:06
再帰下降パーザを書くのに関数型言語は合ってると思う
パーザ以外の部分は知らん

546:デフォルトの名無しさん
09/10/06 22:35:37
Haskellは新しく演算子をユーザ定義できるからな。
優先順位を付けて。それが例えinfixでも。
出来る奴が書いたコードの記述力は破壊的。
Parser Combinatorの発明は、奴等ならではだろう。

547:デフォルトの名無しさん
09/10/06 22:44:43
>>546
> Haskellは新しく演算子をユーザ定義できるからな。
> 優先順位を付けて。それが例えinfixでも。

それPrologでもできるよ。何十年も前から

548:デフォルトの名無しさん
09/10/06 23:00:45
PrologのDCGはBNFそのものだしな。
単純にパーザ記述の容易さを比較するならPrologに軍配があがる。

549:デフォルトの名無しさん
09/10/07 01:01:43
間を取ってLISPだな
そのままLISPの処理系速度で実行できるし

550:デフォルトの名無しさん
09/10/07 06:15:44
RubyとHaskellがベスト

551:デフォルトの名無しさん
09/10/07 07:25:05
noop

552:デフォルトの名無しさん
09/10/07 07:28:15
Ocamlが至高
ほかは糞

553:デフォルトの名無しさん
09/10/07 08:38:22
Ocamlなぁ。
こんどはOcamlでスクリプティングやってみるかなぁ。
静的型付言語の割りにコンパイラが賢いので
人間はあまり型を気にする必要がないというところがよさげだな。

554:デフォルトの名無しさん
09/10/07 10:28:43
>>548
DCGはいいものだったけど、
元になっているPrologが独自すぎて流行らなかったな。
一時はちょっとややこしい構文解析はDCGの独壇場だったのに。

555:デフォルトの名無しさん
09/10/07 13:25:28
>>554

スレ違いになるけど、Prologがブームだった頃「PrologはAI言語である」みたいな解釈の
説明が多かったため、AIブームの終焉と一緒にPrologへの関心も冷めてしまったように
感じてる。Prologなんて記号処理言語の一つで、「道具」にしかすぎないはずなのに。
DCGが自然言語研究の中から生まれたのは事実だけど、パーザ記述向けの「道具」として、
今でも有効に活用できるものだと思う。固定観念さえ捨てることができれば....。

とりあえず、Prologによるコンパイラ開発に興味を持った人向けに書籍を紹介する。
・Prologの技芸, L.Sterling&E.Sharpiro著, 共立出版
Prolog中級者向けの内容で、全体で557ページ、DCGには12ページ、コンパイラ(構文解析/
コード生成/アセンブラ)に関しては24ページが割り当てられている。

556:デフォルトの名無しさん
09/10/07 13:50:43
昔、Prologで簡単なBASICインタプリタをちょこちょこっと作る話が
載ってるウェブページあったなぁ。

557:デフォルトの名無しさん
09/10/07 18:58:11
プログラマならなんか成果物だして世の中の役に立て。


558:デフォルトの名無しさん
09/10/07 23:58:17
>>557
スークリですね解ります。

559:デフォルトの名無しさん
09/10/08 09:23:15
マ板でやれ

560:デフォルトの名無しさん
09/10/08 09:24:40
OCaml使いの間では"O"の部分は使わないのが常識らしいな。

561:デフォルトの名無しさん
09/10/09 11:08:27
OCamlさん 何してはるんですか

562:デフォルトの名無しさん
09/10/12 19:10:26
DSLを設計するための良書ってないですかね?

563:デフォルトの名無しさん
09/10/12 20:32:29
>>562

良書かどうかは分からないけど、とりあえず手持ちの書籍を紹介。
・lex & yacc, John R,Levine他共著, アスキー出版局(O'Reilly本)
この本ではCUI向けのメニュー生成言語、言い換えるとCUI向けメニュー生成処理に特化した
DSLの開発手法が紹介されている。 本全体が429ページで、そのうち33ページがDSL。

あるいは設計しようとしているDSLの適用分野(ドメイン)が明確になっていて、
それをここで提示できるのなら、その分野における類似したDSLを紹介したり、
その類似DSLに関する書籍を紹介したりすることができるかもしれない。

もし適用分野が明確ではなく、一般的なDSL設計技術を勉強したいという話であれば、
残念だけど「一般コンピュータ言語設計論」みたいな題名の抽象的で難解な書籍を
探すしかないと思う。自分は紹介できないや。

ただし、発想を変える事で参考になるやり方もある。
最近ではXMLで様々なデータやルールといった情報を表現することが
普通に行われていると思うけど、そのXMLで表現するタグ構成というのは、
目的とする分野に特化したDSLの一種であると考えることもできる。
だから「XML文書設計法」みたいな題名の書籍を読むことが、参考になるかもしれない。

# ほとんど参考にできるレスじゃなくてゴメソ
# あるいは、推薦図書/必読書のためのスレで質問してもいいのでは?

564:デフォルトの名無しさん
09/10/12 20:42:01
>>562
いずれ書籍になる予定
URLリンク(martinfowler.com)

565:デフォルトの名無しさん
09/10/12 20:50:00
>>564
URLリンク(martinfowler.com)
URLリンク(github.com)
URLリンク(homepages.cwi.nl)

どうもっすこの辺ちょっと読んできます。


566:563
09/10/13 10:06:24
うーみゅ、>>562が期待していたのはMartin Fowler氏の定義した
DSLという用語だったのね。このスレでの質問だったから、
てっきりパーザでミニ言語を作りたいのだと思い込んでしまったぜ。
漏れは釣られたのか?....orz


567:デフォルトの名無しさん
09/10/13 10:18:50
>>566
何を言い出すのだお前は?

568:デフォルトの名無しさん
09/10/13 10:19:51
>>563
baka

569:デフォルトの名無しさん
09/10/13 10:44:07
Wikipedia項目リンク

570:デフォルトの名無しさん
09/10/13 17:52:37
>>566
internal DSLとexternal DSLと呼び分けるのが一般的かと

571:デフォルトの名無しさん
09/10/14 19:30:41
>>563 はきちんと説明して偉いと思うよ。
マーチン・ファウラーがいうDSLを実装するにも、
lex&yaccは必要になることがある。

572:デフォルトの名無しさん
09/10/14 19:39:16
本人乙

573:デフォルトの名無しさん
09/10/14 21:16:50
内部DSLだとlex yaccの出番なくね?

574:デフォルトの名無しさん
09/10/14 23:12:14
DSLでも表記はS式 or 逆ポーランドで良いと思うんだけどな。
俺言語でS式&逆ポーランド&三項演算子というのをやったことあるけど、なかなか良い感じだった。


575:デフォルトの名無しさん
09/10/14 23:26:02
x^2 + 3 * x + 4



(x 2 ^ 3 x * + 4 +)

あなたはどっちが好きですか



576:デフォルトの名無しさん
09/10/15 00:09:22
DSLぐらいだったら二項演算子無しでも良いんじゃね?

俺言語だとこんな感じかね
x 2 ..pow 3 x ..multi ..plus 4 ..plus


577:デフォルトの名無しさん
09/10/15 00:15:34
想定するDSLのプログラマによるよね。

自分用・ギーク向け・趣味用途ならS式でも逆ポーランドでもいいけど
スーツ/エンドユーザー向け・パッケージソフトだったりすると流石に無謀だろ。

578:デフォルトの名無しさん
09/10/15 04:29:11
>>575
(x + 3) * x + 4

579:デフォルトの名無しさん
09/10/15 04:30:18
x 3 + x * 4 +

580:デフォルトの名無しさん
09/10/15 20:27:14
>>576
引数の数を演算子の前のドットの数で表してるんですね。
それって >>576 氏の発明ですか?それともそういった処理系がありますか?

581:デフォルトの名無しさん
09/10/15 21:52:05
fortran

582:デフォルトの名無しさん
09/10/16 00:18:11
後ろに置いたピリオドで、スタックに積んだ返した数を表すのはどうだろう
前後逆か?
.*で不定長引数とか

583:デフォルトの名無しさん
09/10/16 00:19:40
何のためのスタックかわからん

584:576
09/10/16 01:17:54
>580
俺の発案。forth系なんて流行ってないから誰もこんなこと考えないって。
コロンも活用すればそこそこ大きな引数でも使えるから実用的だよ。
.one ..two .:three ..:four

こういうのもWordレベルで一意になるから解析が楽チン。
4 3 2 1 ..sum // 3
4 3 2 1 .:sum // 6
4 3 2 1 ..:sum //10


585:576
09/10/16 01:27:49
>582
それは考えた。Wordレベルで一意になるから良さげだった。
…………普通はデフォルトの戻り値で十分なので後ろピリオドは要らないけど。
他にもこんなことを実装したんだけど、プロセス実行をどうするか考えているので実装は進んでない。

..func //デフォルトの戻り値
..func: //戻り値2つ
..func:. //戻り値3つ
..func[] //戻り値無し(廃棄)
..func[0] //配列型戻り値(全体)
..func[1] //配列型戻り値の1番目を返す
..func[-1] //引数を返す

586:デフォルトの名無しさん
09/10/16 02:04:29
>>584
あんまり突っ込むのも無粋だが、
.2sum とか .8sum とかの方が
見やすくて短くて解析も楽な気がしねぇ?


587:576
09/10/16 02:23:54
その辺りは好みですな。
個人的にはwordの中に数字が入るのが嫌なんでね…………

588:デフォルトの名無しさん
09/10/16 08:36:34
言語は仕様考えて、加減乗除ライブラリと、1文字出力ルーチン作って
階乗とかfib関数作るところまでで、たいてい飽きるの俺法則

589:デフォルトの名無しさん
09/10/16 14:07:02
>>584
そうでしたか。 >>576 氏は天才だと思います。
FORTHみたいな言語を自作するときは参考にさせてもらいます。

590:デフォルトの名無しさん
09/10/16 18:34:44
プレフィックスの数字で長さとかを決めるのって、
昔のFORTRANの文字列(5HHELLO とか)みたいでなんかヤだなぁ。

Verilogのビット幅指定がそうなんだけど。

591:デフォルトの名無しさん
09/10/17 12:19:17
俺、中学の頃、逆ポーランド記法のこと何て、
聞いたことも、無かったけど、自分で、思いついてた、、、

592:デフォルトの名無しさん
09/10/17 13:23:53
逆ポーランド記法は日本語に似ているから、日本人にとってはある意味自然なんだよな。

593:デフォルトの名無しさん
09/10/17 13:55:45
惜しいかな
変なことを考える中学生に今少し学問があれば

594:デフォルトの名無しさん
09/10/17 14:01:40
>>591
「お前が思いつくようなことは、すでに誰かが思いついてる」

ベッコアメの社長が親父に言われたんだったかな?
大昔に見た記事だから忘れたけど

595:デフォルトの名無しさん
09/10/17 15:25:19
それなりの環境にいれば思いつくことは思いつく。
しかし思いついたことを実現まで持っていく奴はなかなかいなくて、大抵
思いついた数年後に世の中のどこかからそれを実現させた会社がでてくる。

596:デフォルトの名無しさん
09/10/18 00:19:13
つ LISP

597:デフォルトの名無しさん
09/10/18 11:29:40
>>592
2から3を引く
3を2から引く

どちらも日本語として自然ですが、RPNとしてはどちらかが間違いですよね?
一見そう見えるというだけだと思います。

598:デフォルトの名無しさん
09/10/18 11:37:48
>>597
2から3を引く --> -1
3を2から引く --> 1

どちらもRPNとして正しいと思うが?

599:デフォルトの名無しさん
09/10/18 11:38:57
日本人は中学で語順で格を示す英語学ぶのだから、
それは機能語である助詞の機能によって、
語順が変えられるのだとすぐ気づくだろう。

600:デフォルトの名無しさん
09/10/18 12:07:45
>>598
おい

601:デフォルトの名無しさん
09/10/18 12:11:40
>>597
>3を2から引く

これは日本語として自然か?
漏れにはえらく不自然に見えるが....。

逆にRPN(Forth系言語)なら "から" を減算元属性付加、"を" を減算先属性付加という
ワードであると考え、ワード "引く" ではスタック上の属性値を参照することで、
演算対象値を決定できる。これなら3と2が逆でもオケー。以下は例。

3  :スタックに3をPUSH
を  :スタックの先頭値に演算先属性を付加
2  :スタックに2をPUSH
から :スタックの先頭値に演算元属性を付加
引く :スタックから値を2個POPし、減算子(演算元値 - 演算先値)を評価して、結果をPUSH

602:598
09/10/18 12:13:11
>>598のカキコは取消

603:デフォルトの名無しさん
09/10/18 16:24:14
そういう風に、本来のRPNにないものを導入しないとダメじゃん、って話。

604:デフォルトの名無しさん
09/10/18 21:56:46
シューティングで弾幕とか敵の動きをスクリプト化したくて
Java上で動くスクリプトエンジンを作ろうと思ったのですが、
・・何から始めたらいいんでしょうか。
スクリプトに使う言語はLuaにしようと思っています。

605:デフォルトの名無しさん
09/10/18 22:23:29
Java上なのにLuaなのかよ。

606:デフォルトの名無しさん
09/10/18 22:59:00
Jua

607:デフォルトの名無しさん
09/10/18 23:01:28
>597
おいおいおい、日本語が逆ポーランドの構造しか持っていないなんて言ってないぜ。
日本語の特徴の一つ(述語を中心とした後置型)が逆ポーランドに似ているということだよ。

〜して、〜して、〜して、……。といった感じでだらだら続けられるのも日本語の特徴だよな。
そういや、各国の言葉の特徴をイラストにしたのがあったな。日本は渦巻だっけ?


608:デフォルトの名無しさん
09/10/19 10:57:43
> といった感じでだらだら続けられるのも日本語の特徴だよな。

逆ポーランド記法から夢が膨らむネット言語学者乙

英語でもできるし、日本語よりもっと簡単なぐらいだ。
新聞などではさすがに極端なのはないが
小説でも眺めてみるとよい。
見るからに馬鹿そうな著者を選ぶのがポイント。

609:デフォルトの名無しさん
09/10/19 11:05:22
逆ポーランド記法を使えば、自然言語処理の能力がアップするに違いない!

610:デフォルトの名無しさん
09/10/19 12:57:18
つ「日本語の語順と逆ポーランド記法」「和文の語順と逆ポーランド記法」どちらも水谷

611:デフォルトの名無しさん
09/10/20 02:04:38
どんなの? >608
日本語よりも柔軟に組めるの?


612:デフォルトの名無しさん
09/10/24 13:47:52
緩いだけだろ
日本語で曖昧さがなく読みやすい長い文を書くのには
読点の使い方や語順を工夫したりとか技術がいる

613:デフォルトの名無しさん
09/10/24 15:33:34
つまり、時代はラテン語か

614:デフォルトの名無しさん
09/10/24 20:47:50
>>613
西洋人にとってのラテン語にあたるものが日本で学ぶ漢文なのよ(割とマジで)


615:デフォルトの名無しさん
09/10/24 20:47:56
古代ギリシャ語でおk


616:デフォルトの名無しさん
09/10/24 23:22:44
>>614
いや漢文じゃなくて古文の方だろjk

617:デフォルトの名無しさん
09/10/24 23:32:57
古文に相当する授業ではたとえばイギリス人ならシェークスピアとか読む。


618:デフォルトの名無しさん
09/10/24 23:46:08
字句解析を手書きするのって難しい・・

619:デフォルトの名無しさん
09/10/25 08:19:24
>>616
漢文です。ていうか常識ないなおまい

620:デフォルトの名無しさん
09/10/25 12:52:17
古文だろ。

621:デフォルトの名無しさん
09/10/25 13:10:32
南部ヨーロッパだと昔使っていた言語だけど、
北部ヨーロッパだと別の民族の言葉だな。

622:デフォルトの名無しさん
09/11/02 20:00:31
「から引く」と「を引く」の二つの演算子つくればいいだけじゃん。とカメレス。
どっちもドンラーポとしては正常だよね。

623:デフォルトの名無しさん
09/11/03 12:31:29
そこは語尾屈折で

624:デフォルトの名無しさん
09/11/06 11:41:09
Rubyで俺DSLを作りたいのですが、パーサーの作り方を解説したURLはないでしょうか


625:デフォルトの名無しさん
09/11/06 12:25:59
ウェブページはあるかもしれんが、URLだけで解説するのは無理だな。

冗談はともかくとして、とりあえず Racc 使い方、で検索するとか。
先頭に出てくるページは、今なんか落ちてるようだが。

ていうか言語内DSLじゃダメなの?

626:624
09/11/06 13:27:03
検索しましたがraccで良いような気がします(合ってますか?)
”Rubyを256倍使うための本 無道編”というraccの解説本がありましたが絶版でした。
どこかに良い資料はないでしょうか。
最終的には俺言語、俺コンパイラ、俺VMが作りたいです。



627:デフォルトの名無しさん
09/11/06 13:44:05
>>626
URLリンク(www.bk1.jp)

そういやANTLRの人がこんな本出すね
Language Implementation Patterns: Create Your Own Domain-Specific
and General Programming Languages
URLリンク(pragprog.com)

628:デフォルトの名無しさん
09/11/06 14:10:12
>>626
ネットで見つかる資料でとりあえずいいと思うんだけど。

629:デフォルトの名無しさん
09/11/06 14:36:41
俺程度の脳みそでは下記のサイトが役に立った
早く2部を作ってくれ。

KENJIの独り言 URLリンク(www.ne.jp)

630:デフォルトの名無しさん
09/11/06 15:39:48
それ、ざっと見たけど、まともに構文解析してない気がする。

...ゲームスクリプトエンジンとして、インタプリタがセーブ・ロードをサポートする所の考察は面白いが。

アセンブラのような文法(ベタッとした、入れ子になった構造がない言語)なら、
それでも構わないけど、どうやら if や式に現れる入れ子構造をどうやって処理したら
いいか、わからなくって手詰まりになっちゃったんじゃないかな?

> もし、複雑な物を使いたい場合、
> スクリプトコンパイラを使うに乗っている拙作の acc.exe を使うか、lexとyaccで作った方が良いと思います。

と本人が言ってるように、yaccも使わないし、再帰降下パーザを手で書くわけでもなく、
シンプルに済ませたいなら、if や while なんかの入れ子なんぞもっての他、
式も (1 + 2) * (3 + 4) なんて複雑な式はきっぱりあきらめる、と。
それくらい割りきらないとダメっつーか。

まぁ昔のFORTRANや、BASICインタプリタは、なんだかんだのテクニックを使って、
そういうのを実装してたわけなんだけどさ。

631:デフォルトの名無しさん
09/11/06 16:43:44
現実に使っていると思われるスクリプトコードの一例がブログに載っているが、そこの一部で説明されているものと大差ないんだな。

変数名を(固定プリフィクス+数字)の形でしか表せないように見える。
管理するの大変そうだ。


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

4800日前に更新/260 KB
担当:undef