«前の日記(2004-04-25) 最新 次の日記(2004-04-27)» 編集

Matzにっき


2004-04-26 [長年日記]

_ [生活]掃除

新居の掃除、および諸事の片付け。ガスの点検、ウッドカーペットの搬入、BSアンテナの取りつけなど。 午前中いっぱいかかってしまった。しかし、それだけで疲れ切ってしまったぞ。

夜には契約関係の処理もすませる。いよいよ引っ越しの準備が整ってきた。

_ [OSS]yaccの弱点(その2)

yaccの宣言的な文法は条件が書けない。 「この条件のときはこのルールを適用しない」というような文法はありえない。

まあ、LALR(1)の性質を考えればある意味当然なので、これを弱点というのは適切ではない。 より正確には「弱点」ではなくて、せいぜい「要望」とか「欲求」とかだな。

とはいえ、 Rubyの文法には「ifなどの条件式には任意の式が書けるけどdoが来てはいけない」とか、 「メソッド引数には任意の式が書けるけどコンマを含んではいけない」のようなルールが存在する。 これに対応するためには、

  • すべてのルールを展開して、doが出現しうるものとdoが出現しないものの両方を用意する(コンマについても同様)。
  • lexerに手を回して予約語doに対して違うトークンを返すようにする。

前者はルールの数が増える(単純計算で4倍)ので、メンテナンスの手間がかかる。 一つのルールを修正するために、 常に4箇所(あるいはそれ以上)を更新する必要がある。あんまりだ。

現在のRubyの実装は後者を使っているのだが、 これもlexerとparserが無闇に強結合するため、メンテナンス性に問題がある。 また、yaccルールだけで文法が理解しにくいのも欠点だ。

私の知る限りでこんな無茶な要求に対応しているcompiler compilerは存在しない。

再帰下降の手書きparserなら、こんな挙動も簡単に実現できる。 「条件式フラグ」や「メソッド引数フラグ」を再帰関数の引き数のひとつに渡せば良い。 しかし、再帰下降parserもメンテしにくいことで知られているんだよなあ。

結局どれでもメンテしにくいんだったら、どれを選んでも同じってことかなあ。

本日のツッコミ(全2件) [ツッコミを入れる]
_ shiro (2004-04-27 08:08)

「C++はだめ」という条件に引っかかってしまうのでしょうけど、ANTLRは条件式を文法に混ぜて書けませんでしたっけ。トークンの無制限な先読みも出来て、LLの弱点をあまり感じなかった覚えがあります。

_ akr (2004-04-27 11:56)

inherited attribute と (ANTLR でいうところの) semantic predicates があればいいわけですよね。<br>ANTLR には両方ありますし、LR でも btyacc や zyacc にあります。<br>べつに無茶な要求だとは思いません。よくある機能なんじゃないかな。

お名前:
E-mail:
コメント:
[]

«前の日記(2004-04-25) 最新 次の日記(2004-04-27)» 編集

track feed Matzにっき Creative Commons License This work is licensed under a Creative Commons License.