首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flex和Lemon解析器

Flex和Lemon解析器
EN

Stack Overflow用户
提问于 2013-10-14 19:57:49
回答 1查看 816关注 0票数 3

我正在尝试学习flex和lemon,以便解析(适度)复杂的文件格式。到目前为止,我已经有了语法和lex文件,并且我相信它可以正确地解析示例文件。现在,我想将使用flex扫描的令牌文本传递给lemon。

flex YYSTYPE定义为

代码语言:javascript
复制
#define YYSTYPE char*

lemon标记类型为

代码语言:javascript
复制
%token_type {char *}

但是,如果我在lemon中有一组规则:

代码语言:javascript
复制
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";
}

输出将是

代码语言:javascript
复制
result a

当它应该是这样的时候

代码语言:javascript
复制
mat1 { a }

我的主要解析循环是:

代码语言:javascript
复制
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组合。

最好的方法是什么?我找不到任何有用的东西。

EN

回答 1

Stack Overflow用户

发布于 2016-06-04 07:01:49

你需要有

代码语言:javascript
复制
yylval = new char[512];

在do-while循环中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19359744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档