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”根据我的想法是将结束值转换为新行,因为编译器正在抱怨