phpLex.exeのコンパイル(64bit版vistaの場合)

前記事でPEAR::HTML_Template_Flexyについて触れましたが、いろいろやってみると、やはりTokenizerをカスタマイズしてトークンを追加したくなってきました。

phpLex.exeの作成

読み込んだHTMLの解析はTokenizer.phpで行われています。ここの動作を修正しなければなりません。 Tokenizer.phpはTokenizer.lexから生成されるファイルで、(人が見ても意味が分からないので)直接編集することはできません。

http://www.n314.com/Flexy/loop.php

こちらで、紹介されているように、phpLexをコンパイルした後、.lexファイルからTokenizer.phpを育成する必要がありそうです。
phpLex.exeのコンパイル通った! - maru.cc@はてな
こちらも参考にして、VSでやってもよかったのですが、csc.exeから試すことにしました。

CVSからダウンロード

紹介されていたCVSとはアドレスが変わっていたようです。私もcygwin環境から

$ cvs -z3 -d:pserver:anonymous@php-sharp.cvs.sourceforge.net:/cvsroot/php-sharp co -P .

で、checkoutして、とりあえず、phpLexでmakeコマンドを打ってみました。
やはりエラーになるようですね。
上記サイトを参考にして、makefileを編集してみました。
64bit版vistaの場合、csc.exeの場所が違うので、編集内容が微妙に変わりますが、私はこんな感じで数か所変更しました。cscについては、「csc.exe を使用したコマンド ラインからのビルド」とかでググって適当に情報をチェックしておきました。
まず、CSC

CSC = /cygdrive/c/Windows/Microsoft.NET/Framework64/v2.0.50727/csc

つぎに、コンパイルターゲットを編集
phpLex以下にbinディレクトリを作って置いた場合、

BIN = bin
$(BIN)/lex.exe : $(SRCLIST) makefile
	$(CSC) /o /t:exe /out:$(BIN)/lex.exe $(SRCLIST)

とします。インデントはタブです。で、makeするとダダーとwarningがでますが、C#の修正は今回は必要ないのでやりません。

$ make bin/lex.exe
/cygdrive/c/Windows/Microsoft.NET/Framework64/v2.0.50727/csc /o /t:exe /out:bin/
lex.exe Lex.cs Input.cs Minimize.cs NfaPair.cs Dfa.cs CharSet.cs Utility.cs Acce
pt.cs Anchor.cs Error.cs Bunch.cs Alloc.cs MakeNfa.cs Nfa.cs Nfa2Dfa.cs Gen.cs S
pec.cs DTrans.cs Emit.cs SimplifyNFA.cs BitSet.cs
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.4016
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.

Spec.cs(105,7): warning CS0618: 'System.Collections.IHashCodeProvider' is
        obsolete: 'Please use IEqualityComparer instead.'
Gen.cs(1006,13): warning CS0162: Unreachable code detected
Spec.cs(165,12): warning CS0618:
        'System.Collections.Hashtable.Hashtable(System.Collections.IHashCodeProv
        ider, System.Collections.IComparer)' is obsolete: 'Please use
        Hashtable(IEqualityComparer) instead.'
Spec.cs(169,12): warning CS0618:
        'System.Collections.Hashtable.Hashtable(System.Collections.IHashCodeProv
        ider, System.Collections.IComparer)' is obsolete: 'Please use
        Hashtable(IEqualityComparer) instead.'
Emit.cs(846,10): warning CS0219: The variable 'spec_access' is assigned but its
        value is never used

一応、できあがった、lex.exeでTokenizerを育成できるか試してみます。

cd examples
../bin/lex.exe simple.lex

おぉ、simple.phpができています。