gpt4 book ai didi

lex - Flex 和 Lemon 解析器

转载 作者:行者123 更新时间:2023-12-02 04:58:21 27 4
gpt4 key购买 nike

我正在尝试学习 flex 和 lemon,以便解析(适度)复杂的文件格式。到目前为止,我有我的语法和 lex 文件,我相信它正确地解析了一个示例文件。现在,我想将用 flex 扫描的 token 文本传递给 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 组合。

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

最佳答案

你需要有

yylval = new char[512];

在 do-while 循环中。

关于lex - Flex 和 Lemon 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19359744/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com