2014-03-05 63 views
1

我試圖從文件(例如1 + 2)中讀取值並在控制檯中輸出答案。操作符正常工作併產生正確的結果,但輸出中的初始值完全錯誤。例如,當我嘗試5 + 3時,它顯示爲6432824 + 6432824 = 12865648,當再次運行它時,顯示爲4597832 + 4597832 = 9195664.因此,即使5和3不同(顯然)顯示它們作爲相同的數字,並且每次運行時看似隨機。我怎樣才能解決這個問題?Flex和野牛計算器計算問題

下面的代碼:

Flex的文件:

%{ 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include "y.tab.h" 
    extern FILE* yyin; 
      FILE* FileOutput; 
    #define YYSTYPE int 
%} 

%% 

[0-9]+ { yylval = (int)yytext; return INTEGER; } 
"+" return ADD; 
"-" return SUBTRACT; 
"*" return MULTIPLY; 
"/" return DIVIDE; 
[ \t] ; 
.  yyerror(); 

%% 

int main(int argc, char *argv[]) 
{ 
    yyin = fopen(argv[1], "r"); 
    FileOutput = fopen("output.c", "w"); 
    yyparse(); 
    fclose(FileOutput); 
    return 0; 
} 

int yywrap(void) 
{ 
return 1; 
} 

int yyerror(void) 
{ 
printf("Error\n"); 
} 

野牛文件:

%{ 
#include <stdio.h> 
#include <stdlib.h> 
extern FILE* FileOutput; 
#define YYSTYPE int 

void createcode(int result, int a, unsigned char op, int b); 

%} 

%token INTEGER 
%token ADD SUBTRACT MULTIPLY DIVIDE 

%left ADD SUBTRACT 
%left MULTIPLY DIVIDE 


%% 
program: 
     | program statement 
     ; 

statement: 
     expression '\n'  { printf("%d\n", $1); } 
     | error '\n'   { yyerrok; } 
     ; 

expression: 
     INTEGER   { $$ = $1; } 
     | expression ADD expression  { $$ = $1 + $3, createcode($$, $1, '+', $3);} 
     | expression SUBTRACT expression  { $$ = $1 - $3; createcode($$, $1, '-', $3);} 
     | expression MULTIPLY expression  { $$ = $1 * $3; createcode($$, $1, '*', $3);} 
     | expression DIVIDE expression  { $$ = $1/$3; createcode($$, $1, '/', $3);} 
     | '(' expression ')'   { $$ = $2; } 
     ; 

%% 

void createcode(int result, int a, unsigned char op, int b) 
{ 
    printf("%d %c %d = %d", a, op, b, result); 
    fprintf(FileOutput, "%d %c %d = %d", a, op, b, result); 
} 

回答

0

你返回一個字符串(字符*),而不是一個整數。最簡單的辦法是在函數yylex使用與strtol:

即代替:

[0-9]+ { yylval = (int)yytext; return INTEGER; } 

嘗試

[0-9]+ { yylval = (int)strtol(yytext, NULL, 10); return INTEGER; } 
+0

謝謝,它的工作〜! http://i.4cdn.org/v/src/1394049079355.png BlackDrMario隨時準備填寫您的處方,只要你需要它。 – BlackDrMario