【问题标题】:actually recognizing hexadecimal but noto converting in hex calculator with flex and bison使用 flex 和 bison 在十六进制计算器中实际识别十六进制但不能转换
【发布时间】:2017-10-08 12:29:17
【问题描述】:

我在使用 flex 和 bison 中的计算器时遇到问题 在这段代码中

0[xX][0-9a-fA-F]+ {yylval=strtol(yytext,0 ,16);return HEX;}

它实际上识别十六进制值,并进行数学运算,但是当我想打印结果时,它以十进制打印。

所以我认为这部分有问题:

/*main(int argc, char **argv)
{
int tok;
while(tok = yylex()) {
printf("%d", tok);
if(tok == NUMBER) printf(" = %d\n", yylval);
else 
if(tok == HEX) 
printf(" = %x\n", yylval);
else
printf("\n");
}
}*/

【问题讨论】:

  • 为什么你的代码在注释里面?也请发MVCE。
  • 你“做数学运算”的部分在哪里?如果您在包含的代码中注释 main`,它是否按预期工作?

标签: hex calculator bison flex-lexer


【解决方案1】:

strtol 以您使用它的方式使用,将 ASCII1 十六进制转换为二进制整数形式。作为int 或long,您可以对其进行操作(加法、减法、乘法等),而不能对ASCII(字符串)形式的数字进行操作。要实际显示一个数字,您需要将其转换回 ASCII,这就是 printf 所做的。通过 %d 转换,它会转换为 ASCII 十进制 - 如果您想要 ASCII 十六进制,请使用 %x


1严格来说,它可能是任何字符集,不一定是 ASCII,但几乎所有 C 编译器都使用 ASCII 或它的某些扩展作为其基本字符集

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2020-06-27
    • 2014-10-30
    • 2019-04-29
    • 2018-09-04
    相关资源
    最近更新 更多