phpLex.exeのコンパイル(64bit版vistaの場合)
前記事でPEAR::HTML_Template_Flexyについて触れましたが、いろいろやってみると、やはりTokenizerをカスタマイズしてトークンを追加したくなってきました。
http://www.n314.com/Flexy/loop.phpphpLex.exeの作成
読み込んだHTMLの解析はTokenizer.phpで行われています。ここの動作を修正しなければなりません。 Tokenizer.phpはTokenizer.lexから生成されるファイルで、(人が見ても意味が分からないので)直接編集することはできません。
こちらで、紹介されているように、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ができています。