《自制編程語言》筆記:使用yacc與lex制作簡單計算器


1、代碼

  1.1)test.l

  1.2)test.y

  1.3)Makefile  (因為是在linux環境下,所以使用了Makefile)

2、編譯與運行

  2.1)編譯

  2.2)運行


 

1、代碼(也可以在我的百度網盤下載:http://pan.baidu.com/s/1o65k7v8

  1.1)lex文件 test.l

 1 %{  2 #include <stdio.h>
 3 #include "y.tab.h"
 4 
 5 int 
 6 yywrap(void)  7 {  8     return 1;  9 } 10 %} 11 %%
12 "+"    return ADD; 13 "-"    return SUB; 14 "*"    return MUL; 15 "/"    return DIV; 16 "\n"   return CR; 17 ([1-9][0-9]*)|0|([0-9]+\.[0-9]*) { 18     double temp; 19     sscanf(yytext, "%lf", &temp); 20     yylval.double_value = temp; 21     return DOUBLE_LITERAL; 22 } 23 [ \t] ; 24 . { 25     fprintf(stderr, "lexical error.\n"); 26     exit(1); 27 } 28 %%

  1.2)yacc文件text.y

 1 %{  2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #define  YYDEBUG 1
 5 %}  6 %union {  7     int int_value;  8     double double_value;  9 } 10 %token <double_value> DOUBLE_LITERAL 11 %token ADD SUB MUL DIV CR 12 %type <double_value> expression term primary_expression 13 %%
14 line_list 15  : line 16     | line_list line 17  ; 18 line 19  : expression CR 20  { 21         printf(">>%lf\n> ", $1); 22  fflush(stdout); 23  } 24 expression 25  : term 26     | expression ADD term 27  { 28         $$ = $1 + $3; 29  } 30     | expression SUB term 31  { 32         $$ = $1 - $3; 33  } 34  ; 35 term 36  : primary_expression 37     | term MUL primary_expression 38  { 39         $$ = $1 * $3; 40  } 41     | term DIV primary_expression 42  { 43         $$ = $1 / $3; 44  } 45  ; 46 primary_expression 47  : DOUBLE_LITERAL 48  ; 49 %%
50 int
51 yyerror(char * str) 52 { 53     extern char * yytext; 54     fprintf(stderr, "parser error near %s\n", yytext); 55     return 0; 56 } 57 
58 int main(void) 59 { 60     extern int yyparse(void); 61     extern FILE * yyin; 62 
63     printf("> "); 64  fflush(stdout); 65     yyin = stdin; 66     if (yyparse()) { 67         fprintf(stderr, "Error ! Error ! Error !\n"); 68         exit(1); 69  } 70 }

  1.3)Makefile文件(其實不用Makefile的,我這里為了每次編譯和清除的時候方面才使用的,以下的命令可以分三步手動執行,原著里面就是手動執行的)

1 .PHONY : dummy 2 
3 all : dummy 4     yacc -dv test.y 5  lex test.l 6     gcc -o test lex.yy.c y.tab.c 7 
8 clean : dummy 9     rm -rf lex.yy.c test y.output y.tab.c y.tab.h

2、編譯與運行

  2.1)編譯

1 $ make
2 yacc -dv test.y 3 lex test.l 4 gcc -o test lex.yy.c y.tab.c

  2.2)運行

1 $ ls
2 lex.yy.c Makefile readme.txt test test.l test.y y.output y.tab.c y.tab.h 3 $ ./test 4 > 1 + 2 * 3-4+2*3/7
5 >>3.857143
6 > q 7 lexical error.

 

來源:《自制編程語言》第二章

百度百科:http://baike.baidu.com/link?url=WC3BGKHo7gMEuPbxrX8Wsa6-KD69HLbRjd6TnmGPZNcq9j7xtgZxXh7RPufn2ISHIwW6A8Zri6Qt_5xViF9Vi_

豆瓣:http://book.douban.com/subject/25735333/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM