我有这个项目,我想在那里工作,我的第一个任务是建立一个deskCalculator。我希望计算器能够解析十六进制数字。以下是有问题的部分。
| HEX {$$ = strtol((char *)$1 , (char **)'\n', 16); }
上面定义了一个标记HEX,在lex文件中定义了正则表达式
hex [a-f0-9]+
问题出在strtol函数的水平上。请帮我。 感谢。
答案 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);