C 如何解析Bison中的十六进制数

C 如何解析Bison中的十六进制数,c,compilation,bison,flex-lexer,C,Compilation,Bison,Flex Lexer,我有一个项目,我想在那里工作,我的第一个任务是建立一个桌面计算器。我希望计算器能够解析十六进制数。下面是有问题的部分 | HEX {$$ = strtol((char *)$1 , (char **)'\n', 16); } 上面定义了标记十六进制,在lex文件中,常规表达式定义为 hex [a-f0-9]+ 问题在于strtol功能级别。请帮帮我。 谢谢。一个解决方案是,一旦lex看到十六进制数,您就让lex将其转换为十六进制值,并将其作为令牌值传递。我不了解bison lexer的细节

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

| HEX {$$ = strtol((char *)$1 , (char **)'\n', 16); }
上面定义了标记十六进制,在lex文件中,常规表达式定义为

hex  [a-f0-9]+
问题在于strtol功能级别。请帮帮我。
谢谢。

一个解决方案是,一旦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);
int-lexval=0;
char*c=yytext;
yytext[yyleng]='\0;
而(*c){

lexval=lexval*16+(*c编译器抱怨有一个很好的理由,而cast几乎从来都不是正确的答案

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

| HEX {$$ = strtol((char *)$1 , NULL, 16); }
(char**)“\n”
的意思是什么?(char**)“\n”根据我的想法是将结束值转换为新行,因为编译器正在抱怨