アカウント名:
パスワード:
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲはアレゲを呼ぶ -- ある傍観者
文法で一番上の言語 (スコア:2, おもしろおかしい)
コンパイラーの本に載っているlex & yacc じゃ作れないだろ。
ここまではわかるんだ。
$tmp =~ s/lex/yacc/;
でも
$tmp =~ s#lex#yacc#;
で俺の知識では破綻する。「#」 はperlでコメントの意味もあるんだ。
Re:文法で一番上の言語 (スコア:0)
「単語の先読み」という概念を理解していれば、
べつに概念的には難しくはないと思うぞ。
それを実装しろと言われたら(破綻なく実装するのは)大変だけど。
でもどうせ、yacc使わずに素のC(やアセンブリ言語やLisp)で
パーサーを書くのは、楽とは言えないものの、
泣くほど大変なことでもないだろう。
なんといってもCなどの再帰が出来る言語で
それなりにパーサーが書ける素養が無ければ、
そこを飛ばしていきなりyaccを使っても、
(アクションの記述で再帰を意識できないと)
どうせハマルでしょ。
まずは簡単なプログラム言語をyaccなしで書いてみようや。
#大変といっても、UnitTestしながらボトムアップに地道に
#作っていけば間違いなく出来るから安心せよ。
#学研「大人の科学」シリーズでプログラム言語作成を特集しないかな?
あとyaccって確か今でも再入というか
「複数のインタプリタインスタンスを同時に持つ」のが
難しいんだよね?
そういう意味ではアレに慣れ切るのは危険な気がする。
Re:文法で一番上の言語 (スコア:1)
> 「#」 はperlでコメントの意味もあるんだ。
この2者(置換のセパレータとコメントの始まり)の区別の構文解析じゃなくて字句解析の領分だし、全然難しくない。
いやらしいのは
$tmp =~ s/lex/yacc/;
$tmp =~ s#lex#yacc#;
$tmp =~ s"lex"yacc";
を、どれも同じように構文解析させるところでしょう。
字句解析と構文解析は独立したものとして、字句解析は構文情報無しに出来るのが理想だけど、
これがあるために、字句解析時にある程度の構文認識をする必要がでてくるわけです。
ちなみに、この構文の元になったsedだと「sXlexXyaccX」なんて指定も出来たり。
まあ、sed の文法だと字句解析が要らないから、これでも構文解析は難しくならないのですが…
Re:文法で一番上の言語 (スコア:1)
素直に "s文字列" をひとつのトークンとして切り出して、
その後"s/A/B/"の形で解析すれば、yacc & lex で簡単に実装できます。
Re:文法で一番上の言語 (スコア:1)
> 素直に "s文字列" をひとつのトークンとして切り出して、
> その後"s/A/B/"の形で解析すれば、yacc & lex で簡単に実装できます。
それを指して「字句解析時にある程度の構文認識をする必要がでてくる」からいやらしいと言ったつもりでした。
あと、sの次に来るセパレータ文字列は「アルファベット・数字・空白以外の任意の文字」が使えたりしますが、lex では正規表現に後方参照を使えません。lexで記述するとなると
「s/[^/]*/[^/]*/[egimosx]」「s#[^#]*#[^#]*#[egimox]」…
などと、区切り文字列ごとにルールを書くが必要があります。
しかも、括弧などペアになる区切り文字を使って「s{yacc}{lex}」だとか「s<yacc>/lex/」なんて記述もできたりして、ややこしさ倍増です。