Hatena::ブログ(Diary)

Rubyとか Illustratorとか SFとか折紙とか このページをアンテナに追加 RSSフィード

2009-03-01

Windowsで 1.9.1 と Racc とスクリプトエンコーディング

| 18:57 | Windowsで 1.9.1 と Racc とスクリプトエンコーディングを含むブックマーク Windowsで 1.9.1 と Racc とスクリプトエンコーディングのブックマークコメント

そういうわけで Windows(XP SP3)で Ruby-1.9.1 で Racc(1.4.6)、文法ファイルの日本語エンコーディングどうしよう。なんというか、SVNキーワード $Date$ の曜日だけなんだけどね、UTF-8N。

と、エラー。

<どこか>\esoteric>racc Hhyy.y
C:/PROGRA~1/RUBY-1~1.1/lib/ruby/gems/1.9.1/gems/racc-1.4.6/bin/racc:143:in `read
': "\x9F" followed by "," on Windows-31J (Encoding::InvalidByteSequenceError)
        from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/gems/1.9.1/gems/racc-1.4.6/bin/racc
:143:in `block in main'
        from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/gems/1.9.1/gems/racc-1.4.6/bin/racc
:277:in `section'
        from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/gems/1.9.1/gems/racc-1.4.6/bin/racc
:141:in `main'
        from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/gems/1.9.1/gems/racc-1.4.6/bin/racc
:308:in `<top (required)>'
        from C:/Program Files/Ruby-1.9.1/bin/racc:19:in `load'
        from C:/Program Files/Ruby-1.9.1/bin/racc:19:in `<main>'

rubyコマンドラインオプション「-Ku」付ければ何とかなるんだけど

<どこか>\esoteric>ruby -Ku "C:\Program Files\Ruby-1.9.1\bin\racc" Hhyy.y

<どこか>\esoteric>

というわけで、1.9.1\bin の racc.bat をちょっと調整。コマンドライン第一引数に -K オプションを設定できるようにした、第一オプション限定。

@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"ruby.exe"" "C:/Program Files/Ruby-1.9.1/bin/racc" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
if "%1" GEQ "-K" (
  @"ruby.exe" %1 "%~dpn0" %2 %3 %4 %5 %6 %7 %8 %9
) else (
  @"ruby.exe" "%~dpn0" %*
)

WinNT側のみ。SHIFT がバッチパラメータ「%*」に影響しないのでちょっと無様。

<どこか>\esoteric>racc -Ku Hhyy.y

<どこか>\esoteric>

Windowsの 1.9.1 で gem で racc

| 12:29 | Windowsの 1.9.1 で gem で raccを含むブックマーク Windowsの 1.9.1 で gem で raccのブックマークコメント

というわけで、Windows (XP SP3) で Ruby-1.9.1 で gem から Racc をインストールする。

C:\Program Files\Ruby-1.9.1\bin>gem update --system
Updating RubyGems
Nothing to update
C:\Program Files\Ruby-1.9.1\bin>gem install racc
Building native extensions.  This could take a while...
ERROR:  Error installing racc:
        ERROR: Failed to build gem native extension.

"C:/Program Files/Ruby-1.9.1/bin/ruby.exe" extconf.rb install racc
extconf.rb:3:in ``': No such file or directory - uname -p (Errno::ENOENT)
        from extconf.rb:3:in `<main>'


Gem files will remain installed in C:/Program Files/Ruby-1.9.1/lib/ruby/gems/1.9
.1/gems/racc-1.4.6 for inspection.
Results logged to C:/Program Files/Ruby-1.9.1/lib/ruby/gems/1.9.1/gems/racc-1.4.
6/ext/racc/cparse/gem_make.out
Updating class cache with 1261 classes...
C:\Program Files\Ruby-1.9.1\bin>gem list -l

*** LOCAL GEMS ***


C:\Program Files\Ruby-1.9.1\bin>

エラーになる。なんだかなあ。

raccコマンドファイル

しかし、この時点で Racc自体は gemディレクトリに入っている(Gem files will remain)、それに Ruby-1.9.1\bin にはバッチファイルや raccコマンドファイルも入っている。

だから動かそうとすれば動く。ただ、gem からは見えないのでアンインストールは出来ないかも、アップデートも不安か。

C:\Program Files\Ruby-1.9.1\bin>ruby racc
no input

C:\Program Files\Ruby-1.9.1\bin>ruby racc --version
racc version 1.4.6

C:\Program Files\Ruby-1.9.1\bin>ruby racc --runtime-version
racc runtime version 1.4.6 (rev. $Id$); c core version 1.4.5 (rev. 1.8)

runtime のバージョンがずれてるのはちょっと気に掛かるかな。runtime 自体は ruby同梱でしたっけ。

racc.bat ファイル

しかし、そのバッチファイルが動かない。

C:\Program Files\Ruby-1.9.1\bin>racc
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。

C:\Program Files\Ruby-1.9.1\bin>racc.bat
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。

なんでだ

@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"ruby.exe"" "C:/Program Files/Ruby-1.9.1/bin/racc" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"ruby.exe"" "%~dpn0" %*

行頭「@」がコマンドのエコーを抑制するし、ちょっと悩んでしまったけど、単純な事だった。そういえば前もそうだったよね。

最後の行、「"」が重複してる。これを一文字削除すればOK

@"ruby.exe" "%~dpn0" %*

これで racc 動く様になった。

C:\Program Files\Ruby-1.9.1\bin>racc
no input

C:\Program Files\Ruby-1.9.1\bin>racc.bat --runtime-version
racc runtime version 1.4.6 (rev. $Id$); c core version 1.4.5 (rev. 1.8)

一応前掲の Helloworld言語とか、HQ9+言語とかのジェネレートは(それなりの 1.9対応の上で)成功した。

hs9587hs9587 2009/03/01 21:16 非NT系(95系)分岐の方でも「@"ruby.exe""」二重引用符重複してるね、適宜修正しましょう

hs9587hs9587 2009/04/05 15:50 バッチファイルの「GEQ "-K"」は適正ではなかった。-Ku とかのエンコード指定は所定の動作をするが、辞書順か何かでくらべてるのか、-v とまも受け付けてしまう。「"%1"=="-Ku"」にしよう。ちょっとなんだけど。