我正在尝试学习flex和lemon,以便解析(适度)复杂的文件格式。到目前为止,我已经有了语法和lex文件,并且我相信它可以正确地解析示例文件。现在,我想将使用flex扫描的令牌文本传递给lemon。
flex YYSTYPE定义为
#define YYSTYPE char*lemon标记类型为
%token_type {char *}但是,如果我在lemon中有一组规则:
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组合。
最好的方法是什么?我找不到任何有用的东西。
发布于 2016-06-04 07:01:49
你需要有
yylval = new char[512];在do-while循环中。
https://stackoverflow.com/questions/19359744
复制相似问题