第二十回スパルタンプログラミング
何がしたいか?何が問題か?を意識して変なとこでぐだぐだ考えないこと! 30分悩んで分からなかったら、早めにヘルプを出す。
やりたいこと
- lexical analizerのtestをしたい。
理由は字句解釈のバグを修正した際、その修正の影響は文におよぶ。よって字句解釈のtest、字句が構成する文のtestが必要となる。これを手でやるのは馬鹿だと思うから。
何が問題か
以下、lex&yacc本から引用 p.31
- lexのパタンは入力文字または文字列にただ一度だけしかマッチしない。
- lexは現在の入力に対してマッチする長さがもっとも長いパタンのアクションを実行する。
なので、規則部に見つけたい文を記述すると文は引っ掛けられても、文を構成する字句は引っ掛けられず、どうテストを書けばよいか分からない。
当初、lexで字句を広い、yaccで記述しようと考えた。が以下を問題視した。
- ABNFと記述方法が見た目上大きくずれるので、記述が正しいのか見えにくい。
- コードを追う際に、lexとyaccのファイルを行ったり来たりしないと行けない。
何が必要か
REJECTが銀の弾丸であった。以下、lex&yacc本から引用 p.31
通常lexは入力を重なりのないトークンに分割する。しかしながら、ほかのトークンと重なっても処理したい場合もある。 REJECTという特殊なアクションを使うとこれが可能になる。 アクションがREJECTを実行すると、lexはパタンにマッチしたテキストを論理的に押し戻し、次にマッチするものを探す。
これを見つけることができてよかった。
台無しにする発見
おい、いっしー、てめぇ。僕はこういうの根に持つタイプだよ!
bnfcを入れようとしたら入らない。のでghc, cabalを整理した。
- brew install したghc, cabal等を全部uninstall。
- /Library/Haskell/bin/uninstall.hsの実行と/Library/Haskell/のrm。
- .cabal, .ghcの消去
- ghcの再インストール 14.09.23追記:はまったー
言葉
- 最短マッチング、最長マッチング