3

(適度に)複雑なファイル形式を解析するために、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 の組み合わせを出力しています。

最善の方法は何ですか?うまくいくものが見つかりません。

4

1 に答える 1

0

あなたが持っている必要があります

yylval = new char[512];

do-while ループ内。

于 2016-06-03T23:01:49.157 に答える