标签:
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://book.douban.com/subject/25735333/
标签:
原文地址:http://www.cnblogs.com/fengbohello/p/4634073.html