程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 自己動手寫C語言編譯器(5)

自己動手寫C語言編譯器(5)

編輯:關於C語言

 

C代碼 

%{ 

#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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved