2013-12-16 94 views
1

我一直在尝试编写一个Lex程序将八进制数转换为十进制数。但是在接受数字作为输入之后,却没有做任何事情。没有输出。并没有程序终止。该程序仍在运行,没有任何输出。在Lex中将八进制数转换为十进制数

什么可能是错误?我对yywraptodec功能有着强烈的感觉。

在此先感谢。 :)

源代码:

%{ 
    #include <stdlib.h> 
    #include <stdio.h> 
    #include <math.h> 
    int v = 0, o = 0, d = 0; //valid bit, octal number, decimal number 
%} 

%% 
^[0-7]+ {v = 1; o = atoi(yytext);} 
[\n] {;} 
. {v = 0;} 
%% 

int yywrap() 
{ 
    if (v) 
    { 
     d = todec(o); 
     printf("Decimal is %d\n", d); 
    } 
    else 
    { 
     printf("Invalid"); 
    } 
} 

int todec(int oct) 
{ 
    int dec = 0, pos = 0; 
    while(oct) 
    { 
     int a = oct % 10; 
     dec += a * pow(8, pos); 
     pos++; 
     oct /= 10; 
    } 
    return dec; 
} 

int main() 
{ 
    printf("Enter the octal number: "); 
    yylex(); 
    return 0; 
} 
+0

也就是说文本转换数为二进制我已经在很长一段时间看到的最奇怪的方式。你使用'atoi()'转换一次,然后以某种方式重新解释已转换的数字,就好像它是八进制的? 'atoi()'的结果是“一个数字”;它可能表示为在计算机内存中的位,但它肯定是*不是*“十进制”,因为您的代码似乎假设。 – unwind

回答

0

我将引述http://dinosaur.compilertools.net/flex/flex_10.html
* 当扫描器接收来自YYINPUT最终的文件指示,它随后检查yywrap()函数

因此,如果您使用ctrl-d模拟EOL行为(输入数字并按回车键后),则可以看到您的计算结果是正确的。

如果你想立即看到结果,你将不得不在计算后编写输出。

干杯

相关问题