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を書くのと同じ効果があります。