如何在Bison中解析HEX数字

时间:2015-08-04 10:03:08

标签: c compilation bison flex-lexer

我有这个项目,我想在那里工作,我的第一个任务是建立一个deskCalculator。我希望计算器能够解析十六进制数字。以下是有问题的部分。

| HEX {$$ = strtol((char *)$1 , (char **)'\n', 16); }

上面定义了一个标记HEX,在lex文件中定义了正则表达式

hex  [a-f0-9]+

问题出在strtol函数的水平上。请帮我。 感谢。

2 个答案:

答案 0 :(得分:1)

编译器有一个很好的理由抱怨,而演员几乎从来都不是正确的答案。

strtol将指向转换后的字符串后的第一个字符的指针存储到end参数中。由于10'\n'的值)可能不是您的有效地址,因此当strtol尝试修改它时,程序会导致未定义的行为。如果您对字符串的其余部分不感兴趣,可以通过NULL

| HEX {$$ = strtol((char *)$1 , NULL, 16); }

答案 1 :(得分:0)

一种解决方案是,只要lex看到十六进制数,就让lex将其转换为您传递的十六进制值作为标记值。我不是bison lexer的具体细节,但基本代码是:

int lexval= 0;
char *c= yytext;
yytext[yyleng]= '\0;
while (*c) {
    lexval = lexval * 16 + (*c<=9 ? *c-'0' : tolower(*c)-'a');
    c++;
}
return(lexval);