(適度に)複雑なファイル形式を解析するために、flexとlemonを学ぼうとしています。これまでのところ、文法と lex ファイルがあり、サンプル ファイルを正しく解析していると思います。今のところ、flex でスキャンしたトークン テキストを lemon に渡したいと思っています。
フレックス YYSTYPE は次のように定義されます。
#define YYSTYPE char*
レモントークンの種類は
%token_type {char *}
ただし、レモンに一連のルールがある場合:
start ::= MATDEF IDENTIFIER(matName) LEFT_CURLY_BRACE(left) materialDefinitionBody(mBody) RIGHT_CURLY_BRACE(right) .
{
std::string r = std::string(matName) + std::string(left) + mBody + std::string(right);
std::cout << "result " << r << std::endl;
}
materialDefinitionBody(r) ::= techniqueList .
{
r = "a";
}
出力は次のようになります
result a
それが次のようなものであるべきとき
mat1 { a }
私の主な解析ループは次のとおりです。
void parse(const string& commandLine) {
// Set up the scanner
yyscan_t scanner;
yylex_init(&scanner);
YY_BUFFER_STATE bufferState = yy_scan_string(commandLine.c_str(), scanner);
// Set up the parser
void* shellParser = ParseAlloc(malloc);
yylval = new char[512];
int lexCode;
do {
yylval[0] = 0;
lexCode = yylex(scanner);
cout << lexCode << " : " << yylval << std::endl;
Parse(shellParser, lexCode, yylval);
}
while (lexCode > 0);
if (-1 == lexCode) {
cerr << "The scanner encountered an error.\n";
}
// Cleanup the scanner and parser
yy_delete_buffer(bufferState, scanner);
yylex_destroy(scanner);
ParseFree(shellParser, free);
}
cout 行は、正しい lexCode/yylval の組み合わせを出力しています。
最善の方法は何ですか?うまくいくものが見つかりません。