自己动手写C语言编译器(5)

xiaoxiao2021-02-28  89

依托Bison强大的工具, 写编译器,先用编译原理搞个计算器玩玩。如下:

 

Bison工具:

http://coolshell.cn/articles/1547.html

http://www.gnu.org/software/bison/manual/index.html

http://baike.baidu.com/view/1137652.htm

1.1 Languages and Context-Free Grammars

文件:first.y

 

%{ #define YYSTYPE double #include <math.h> int yylex (void); void yyerror (char const *); %} %token NUM %% input: |input line ; line: '\n' | exp '\n' {printf("\t%.10g\n", $1);} ; exp: NUM { $$ = $1; } | exp exp '+' { $$ = $1 + $2; } | exp exp '-' { $$ = $1 - $2; } | exp exp '*' { $$ = $1 * $2; } | exp exp '/' { $$ = $1 / $2; } /* Unary minus */ | exp 'n' { $$ = -$1; } ; %% #include <stdio.h> int yylex (void) { int c; /* Skip white space. */ while ((c = getchar ()) == ' ' || c == '\t') ; /* Process numbers. */ if (c == '.' || isdigit (c)) { ungetc (c, stdin); scanf ("%lf", &yylval); return NUM; } /* Return end-of-input. */ if (c == EOF) return 0; /* Return a single char. */ return c; } void yyerror (char const * error) { } int main() { return yyparse (); }

在Ubuntu的linux下安装Bison2.5,运行:

bison first.y

gcc -o first first.tab.c

 

运行 

./fisrt

 

1  4  +

    5

3  10  *

       30

 

OK。

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-76013.html

最新回复(0)