bison -oParser.c -d Parser.y ren Parser.c Perser.cppとします。もし、
bison -oParser.cpp -d Parser.yとすると、Parser.cpp.hというファイルが出来てしまいまって、 うまく行きません。
extern void yy_input(char*, int*, int); #define yy_input(buf, count, max) yy_input(buf, &count, max)yy_inputという関数は、unit1.cppなどで定義します。
delim [ \t\n\r]
flex -oLexer.cpp -I Lexer.lです。
yy_input(char* buf, int* count, int max)
buf 文字列をコピーする先
count 実際に bufにコピーした文字数を返す。
max コピーしても良い最大の文字数
例えば、Memo1から文字を読む場合、
void yy_input(char* buf, int* count, int max)
{
int textlength = Form1->Memo1->Text.Length();
if (numberread < 0) {
*count = 0; /* すでに終了している */
} else if (textlength - numberread > max) {
memcpy(buf, Form1->Memo1->Text.SubString(numberread, max).c_str(), max);
numberread += max;
*count = max; /* countに実際にコピーした文字数を返す。*/
} else {
*count = textlength - numberread;
memcpy(buf,
Form1->Memo1->Text.SubString(numberread, *count).c_str(), *count);
numberread = -1; /* 終了のしるし */
}
}
のようになります。
bcc32 -c -DMSDOS;YY_ALWAYS_INTERACTIVE=1 Parser.cpp bcc32 -c -DMSDOS;YY_ALWAYS_INTERACTIVE=1 Lexer.cpp-cは、 分割コンパイルを指定するオプションです。 (main関数がないので、実行可能ファイルにはできません。) Parser.objと Lexer.objという名前のオブジェクト(.obj)ファイルができます。
-D...はソースプログラムの最初に #define文
#define MSDOS #define YY_ALWAYS_INTERACTIVE 1を書くのと同じ効果があります。