【发布时间】:2018-06-05 16:41:43
【问题描述】:
我尝试编写一个编译器,并使用 flex/bison 进行扫描和解析。 我的问题是关于这 2 个如何通信,以便 lex 传递一个标记类型和(如果需要)一个语义值。
问题是我发现了不同的(冲突的?)文档。
例如here,他们提到使用 yylval 子字段作为语义值,并返回令牌类型(可能是整数)。
[0-9]+ {
yylval->build<int> () = text_to_int (yytext);
return yy::parser::token::INTEGER;
}
[a-z]+ {
yylval->build<std::string> () = yytext;
return yy::parser::token::IDENTIFIER;
}
但是,我看到(也在官方文档中)this:
"-" return yy::calcxx_parser::make_MINUS (loc);
"+" return yy::calcxx_parser::make_PLUS (loc);
"*" return yy::calcxx_parser::make_STAR (loc);
"/" return yy::calcxx_parser::make_SLASH (loc);
"(" return yy::calcxx_parser::make_LPAREN (loc);
")" return yy::calcxx_parser::make_RPAREN (loc);
":=" return yy::calcxx_parser::make_ASSIGN (loc);
{int} {
errno = 0;
long n = strtol (yytext, NULL, 10);
if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
driver.error (loc, "integer is out of range");
return yy::calcxx_parser::make_NUMBER (n, loc);
}
{id} return yy::calcxx_parser::make_IDENTIFIER (yytext, loc);
. driver.error (loc, "invalid character");
<<EOF>> return yy::calcxx_parser::make_END (loc);
这里根本没有提到yylval,我们返回的是一些奇怪的make_???函数,我不明白它们是在哪里定义的,它们接受什么参数以及它们返回什么。
有人可以向我澄清这两种方法之间的区别吗?如果我应该使用第二种方法,请简要解释一下那些神秘的make_???方法?
提前致谢!
【问题讨论】:
标签: c++ bison flex-lexer