使用Lex和Yacc开发C语言的编译器
来源:互联网 发布:风景线打印软件注册 编辑:程序博客网 时间:2024/04/27 17:52
(1) 从网站:http://www.lysator.liu.se/c/ 下载C语言的语法文件:
The ANSI C grammar (Yacc and Lex)
(2) 编译词法文件:
(4) 编译语法分析器:
编写测试程序test.c
结果如下:
发现c.y文件中没有语义动作。只是进行了词法扫描一下,所以得到结果就是上面的样子了。
(5) 贴一下y.out里的规则:
The ANSI C grammar (Yacc and Lex)
(2) 编译词法文件:
> lex c.l
(3) 编译语法文件:> yacc -dv c.y
说明:-d:产生头文件y.yab.h,-v:产生分析表y.output。针对else产生的移进规约冲突,采用了yacc的默认动作“移进”解决。(4) 编译语法分析器:
> cc lex.yy.c y.tab.c -ll
(5) 测试:编写测试程序test.c
#include "stdio.h"
int main(){
int a = 0;
for(; a < 10; a++){
printf("hello from sun! ");
}
}
运行:int main(){
int a = 0;
for(; a < 10; a++){
printf("hello from sun! ");
}
}
> ./a.out < test.c
结果如下:
"stdio.h"
int (){
int = ;
for(; < ; ++){
int("hello from sun hong hao! ");
}
}
int (){
int = ;
for(; < ; ++){
int("hello from sun hong hao! ");
}
}
发现c.y文件中没有语义动作。只是进行了词法扫描一下,所以得到结果就是上面的样子了。
(5) 贴一下y.out里的规则:
0 $accept : translation_unit $end
1 primary_expression : IDENTIFIER
2 | CONSTANT
3 | STRING_LITERAL
4 | '(' expression ')'
5 postfix_expression : primary_expression
6 | postfix_expression '[' expression ']'
7 | postfix_expression '(' ')'
8 | postfix_expression '(' argument_expression_list ')'
9 | postfix_expression '.' IDENTIFIER
10 | postfix_expression PTR_OP IDENTIFIER
11 | postfix_expression INC_OP
12 | postfix_expression DEC_OP
13 argument_expression_list : assignment_expression
14 | argument_expression_list ',' assignment_expression
15 unary_expression : postfix_expression
16 | INC_OP unary_expression
17 | DEC_OP unary_expression
18 | unary_operator cast_expression
19 | SIZEOF unary_expression
20 | SIZEOF '(' type_name ')'
21 unary_operator : '&'
22 | '*'
23 | '+'
24 | '-'
25 | '~'
26 | '!'
27 cast_expression : unary_expression
28 | '(' type_name ')' cast_expression
29 multiplicative_expression : cast_expression
30 | multiplicative_expression '*' cast_expression
31 | multiplicative_expression '/' cast_expression
32 | multiplicative_expression '%' cast_expression
33 additive_expression : multiplicative_expression
34 | additive_expression '+' multiplicative_expression
35 | additive_expression '-' multiplicative_expression
36 shift_expression : additive_expression
37 | shift_expression LEFT_OP additive_expression
38 | shift_expression RIGHT_OP additive_expression
39 relational_expression : shift_expression
40 | relational_expression '<' shift_expression
41 | relational_expression '>' shift_expression
42 | relational_expression LE_OP shift_expression
43 | relational_expression GE_OP shift_expression
44 equality_expression : relational_expression
45 | equality_expression EQ_OP relational_expression
46 | equality_expression NE_OP relational_expression
47 and_expression : equality_expression
48 | and_expression '&' equality_expression
49 exclusive_or_expression : and_expression
50 | exclusive_or_expression '^' and_expression
51 inclusive_or_expression : exclusive_or_expression
52 | inclusive_or_expression '|' exclusive_or_expression
53 logical_and_expression : inclusive_or_expression
54 | logical_and_expression AND_OP inclusive_or_expression
55 logical_or_expression : logical_and_expression
56 | logical_or_expression OR_OP logical_and_expression
57 conditional_expression : logical_or_expression
58 | logical_or_expression '?' expression ':' conditional_expression
59 assignment_expression : conditional_expression
60 | unary_expression assignment_operator assignment_expression
61 assignment_operator : '='
62 | MUL_ASSIGN
63 | DIV_ASSIGN
64 | MOD_ASSIGN
65 | ADD_ASSIGN
66 | SUB_ASSIGN
67 | LEFT_ASSIGN
68 | RIGHT_ASSIGN
69 | AND_ASSIGN
70 | XOR_ASSIGN
71 | OR_ASSIGN
72 expression : assignment_expression
73 | expression ',' assignment_expression
74 constant_expression : conditional_expression
75 declaration : declaration_specifiers ';'
76 | declaration_specifiers init_declarator_list ';'
77 declaration_specifiers : storage_class_specifier
78 | storage_class_specifier declaration_specifiers
79 | type_specifier
80 | type_specifier declaration_specifiers
81 | type_qualifier
82 | type_qualifier declaration_specifiers
83 init_declarator_list : init_declarator
84 | init_declarator_list ',' init_declarator
85 init_declarator : declarator
86 | declarator '=' initializer
87 storage_class_specifier : TYPEDEF
88 | EXTERN
89 | STATIC
90 | AUTO
91 | REGISTER
92 type_specifier : VOID
93 | CHAR
94 | SHORT
95 | INT
96 | LONG
97 | FLOAT
98 | DOUBLE
99 | SIGNED
100 | UNSIGNED
101 | struct_or_union_specifier
102 | enum_specifier
103 | TYPE_NAME
104 struct_or_union_specifier : struct_or_union IDENTIFIER '{' struct_declaration_list '}'
105 | struct_or_union '{' struct_declaration_list '}'
106 | struct_or_union IDENTIFIER
107 struct_or_union : STRUCT
108 | UNION
109 struct_declaration_list : struct_declaration
110 | struct_declaration_list struct_declaration
111 struct_declaration : specifier_qualifier_list struct_declarator_list ';'
112 specifier_qualifier_list : type_specifier specifier_qualifier_list
113 | type_specifier
114 | type_qualifier specifier_qualifier_list
115 | type_qualifier
116 struct_declarator_list : struct_declarator
117 | struct_declarator_list ',' struct_declarator
118 struct_declarator : declarator
119 | ':' constant_expression
120 | declarator ':' constant_expression
121 enum_specifier : ENUM '{' enumerator_list '}'
122 | ENUM IDENTIFIER '{' enumerator_list '}'
123 | ENUM IDENTIFIER
124 enumerator_list : enumerator
125 | enumerator_list ',' enumerator
126 enumerator : IDENTIFIER
127 | IDENTIFIER '=' constant_expression
128 type_qualifier : CONST
129 | VOLATILE
130 declarator : pointer direct_declarator
131 | direct_declarator
132 direct_declarator : IDENTIFIER
133 | '(' declarator ')'
134 | direct_declarator '[' constant_expression ']'
135 | direct_declarator '[' ']'
136 | direct_declarator '(' parameter_type_list ')'
137 | direct_declarator '(' identifier_list ')'
138 | direct_declarator '(' ')'
139 pointer : '*'
140 | '*' type_qualifier_list
141 | '*' pointer
142 | '*' type_qualifier_list pointer
143 type_qualifier_list : type_qualifier
144 | type_qualifier_list type_qualifier
145 parameter_type_list : parameter_list
146 | parameter_list ',' ELLIPSIS
147 parameter_list : parameter_declaration
148 | parameter_list ',' parameter_declaration
149 parameter_declaration : declaration_specifiers declarator
150 | declaration_specifiers abstract_declarator
151 | declaration_specifiers
152 identifier_list : IDENTIFIER
153 | identifier_list ',' IDENTIFIER
154 type_name : specifier_qualifier_list
155 | specifier_qualifier_list abstract_declarator
156 abstract_declarator : pointer
157 | direct_abstract_declarator
158 | pointer direct_abstract_declarator
159 direct_abstract_declarator : '(' abstract_declarator ')'
160 | '[' ']'
161 | '[' constant_expression ']'
162 | direct_abstract_declarator '[' ']'
163 | direct_abstract_declarator '[' constant_expression ']'
164 | '(' ')'
165 | '(' parameter_type_list ')'
166 | direct_abstract_declarator '(' ')'
167 | direct_abstract_declarator '(' parameter_type_list ')'
168 initializer : assignment_expression
169 | '{' initializer_list '}'
170 | '{' initializer_list ',' '}'
171 initializer_list : initializer
172 | initializer_list ',' initializer
173 statement : labeled_statement
174 | compound_statement
175 | expression_statement
176 | selection_statement
177 | iteration_statement
178 | jump_statement
179 labeled_statement : IDENTIFIER ':' statement
180 | CASE constant_expression ':' statement
181 | DEFAULT ':' statement
182 compound_statement : '{' '}'
183 | '{' statement_list '}'
184 | '{' declaration_list '}'
185 | '{' declaration_list statement_list '}'
186 declaration_list : declaration
187 | declaration_list declaration
188 statement_list : statement
189 | statement_list statement
190 expression_statement : ';'
191 | expression ';'
192 selection_statement : IF '(' expression ')' statement
193 | IF '(' expression ')' statement ELSE statement
194 | SWITCH '(' expression ')' statement
195 iteration_statement : WHILE '(' expression ')' statement
196 | DO statement WHILE '(' expression ')' ';'
197 | FOR '(' expression_statement expression_statement ')' statement
198 | FOR '(' expression_statement expression_statement expression ')' statement
199 jump_statement : GOTO IDENTIFIER ';'
200 | CONTINUE ';'
201 | BREAK ';'
202 | RETURN ';'
203 | RETURN expression ';'
204 translation_unit : external_declaration
205 | translation_unit external_declaration
206 external_declaration : function_definition
207 | declaration
208 function_definition : declaration_specifiers declarator declaration_list compound_statement
209 | declaration_specifiers declarator compound_statement
210 | declarator declaration_list compound_statement
211 | declarator compound_statement
1 primary_expression : IDENTIFIER
2 | CONSTANT
3 | STRING_LITERAL
4 | '(' expression ')'
5 postfix_expression : primary_expression
6 | postfix_expression '[' expression ']'
7 | postfix_expression '(' ')'
8 | postfix_expression '(' argument_expression_list ')'
9 | postfix_expression '.' IDENTIFIER
10 | postfix_expression PTR_OP IDENTIFIER
11 | postfix_expression INC_OP
12 | postfix_expression DEC_OP
13 argument_expression_list : assignment_expression
14 | argument_expression_list ',' assignment_expression
15 unary_expression : postfix_expression
16 | INC_OP unary_expression
17 | DEC_OP unary_expression
18 | unary_operator cast_expression
19 | SIZEOF unary_expression
20 | SIZEOF '(' type_name ')'
21 unary_operator : '&'
22 | '*'
23 | '+'
24 | '-'
25 | '~'
26 | '!'
27 cast_expression : unary_expression
28 | '(' type_name ')' cast_expression
29 multiplicative_expression : cast_expression
30 | multiplicative_expression '*' cast_expression
31 | multiplicative_expression '/' cast_expression
32 | multiplicative_expression '%' cast_expression
33 additive_expression : multiplicative_expression
34 | additive_expression '+' multiplicative_expression
35 | additive_expression '-' multiplicative_expression
36 shift_expression : additive_expression
37 | shift_expression LEFT_OP additive_expression
38 | shift_expression RIGHT_OP additive_expression
39 relational_expression : shift_expression
40 | relational_expression '<' shift_expression
41 | relational_expression '>' shift_expression
42 | relational_expression LE_OP shift_expression
43 | relational_expression GE_OP shift_expression
44 equality_expression : relational_expression
45 | equality_expression EQ_OP relational_expression
46 | equality_expression NE_OP relational_expression
47 and_expression : equality_expression
48 | and_expression '&' equality_expression
49 exclusive_or_expression : and_expression
50 | exclusive_or_expression '^' and_expression
51 inclusive_or_expression : exclusive_or_expression
52 | inclusive_or_expression '|' exclusive_or_expression
53 logical_and_expression : inclusive_or_expression
54 | logical_and_expression AND_OP inclusive_or_expression
55 logical_or_expression : logical_and_expression
56 | logical_or_expression OR_OP logical_and_expression
57 conditional_expression : logical_or_expression
58 | logical_or_expression '?' expression ':' conditional_expression
59 assignment_expression : conditional_expression
60 | unary_expression assignment_operator assignment_expression
61 assignment_operator : '='
62 | MUL_ASSIGN
63 | DIV_ASSIGN
64 | MOD_ASSIGN
65 | ADD_ASSIGN
66 | SUB_ASSIGN
67 | LEFT_ASSIGN
68 | RIGHT_ASSIGN
69 | AND_ASSIGN
70 | XOR_ASSIGN
71 | OR_ASSIGN
72 expression : assignment_expression
73 | expression ',' assignment_expression
74 constant_expression : conditional_expression
75 declaration : declaration_specifiers ';'
76 | declaration_specifiers init_declarator_list ';'
77 declaration_specifiers : storage_class_specifier
78 | storage_class_specifier declaration_specifiers
79 | type_specifier
80 | type_specifier declaration_specifiers
81 | type_qualifier
82 | type_qualifier declaration_specifiers
83 init_declarator_list : init_declarator
84 | init_declarator_list ',' init_declarator
85 init_declarator : declarator
86 | declarator '=' initializer
87 storage_class_specifier : TYPEDEF
88 | EXTERN
89 | STATIC
90 | AUTO
91 | REGISTER
92 type_specifier : VOID
93 | CHAR
94 | SHORT
95 | INT
96 | LONG
97 | FLOAT
98 | DOUBLE
99 | SIGNED
100 | UNSIGNED
101 | struct_or_union_specifier
102 | enum_specifier
103 | TYPE_NAME
104 struct_or_union_specifier : struct_or_union IDENTIFIER '{' struct_declaration_list '}'
105 | struct_or_union '{' struct_declaration_list '}'
106 | struct_or_union IDENTIFIER
107 struct_or_union : STRUCT
108 | UNION
109 struct_declaration_list : struct_declaration
110 | struct_declaration_list struct_declaration
111 struct_declaration : specifier_qualifier_list struct_declarator_list ';'
112 specifier_qualifier_list : type_specifier specifier_qualifier_list
113 | type_specifier
114 | type_qualifier specifier_qualifier_list
115 | type_qualifier
116 struct_declarator_list : struct_declarator
117 | struct_declarator_list ',' struct_declarator
118 struct_declarator : declarator
119 | ':' constant_expression
120 | declarator ':' constant_expression
121 enum_specifier : ENUM '{' enumerator_list '}'
122 | ENUM IDENTIFIER '{' enumerator_list '}'
123 | ENUM IDENTIFIER
124 enumerator_list : enumerator
125 | enumerator_list ',' enumerator
126 enumerator : IDENTIFIER
127 | IDENTIFIER '=' constant_expression
128 type_qualifier : CONST
129 | VOLATILE
130 declarator : pointer direct_declarator
131 | direct_declarator
132 direct_declarator : IDENTIFIER
133 | '(' declarator ')'
134 | direct_declarator '[' constant_expression ']'
135 | direct_declarator '[' ']'
136 | direct_declarator '(' parameter_type_list ')'
137 | direct_declarator '(' identifier_list ')'
138 | direct_declarator '(' ')'
139 pointer : '*'
140 | '*' type_qualifier_list
141 | '*' pointer
142 | '*' type_qualifier_list pointer
143 type_qualifier_list : type_qualifier
144 | type_qualifier_list type_qualifier
145 parameter_type_list : parameter_list
146 | parameter_list ',' ELLIPSIS
147 parameter_list : parameter_declaration
148 | parameter_list ',' parameter_declaration
149 parameter_declaration : declaration_specifiers declarator
150 | declaration_specifiers abstract_declarator
151 | declaration_specifiers
152 identifier_list : IDENTIFIER
153 | identifier_list ',' IDENTIFIER
154 type_name : specifier_qualifier_list
155 | specifier_qualifier_list abstract_declarator
156 abstract_declarator : pointer
157 | direct_abstract_declarator
158 | pointer direct_abstract_declarator
159 direct_abstract_declarator : '(' abstract_declarator ')'
160 | '[' ']'
161 | '[' constant_expression ']'
162 | direct_abstract_declarator '[' ']'
163 | direct_abstract_declarator '[' constant_expression ']'
164 | '(' ')'
165 | '(' parameter_type_list ')'
166 | direct_abstract_declarator '(' ')'
167 | direct_abstract_declarator '(' parameter_type_list ')'
168 initializer : assignment_expression
169 | '{' initializer_list '}'
170 | '{' initializer_list ',' '}'
171 initializer_list : initializer
172 | initializer_list ',' initializer
173 statement : labeled_statement
174 | compound_statement
175 | expression_statement
176 | selection_statement
177 | iteration_statement
178 | jump_statement
179 labeled_statement : IDENTIFIER ':' statement
180 | CASE constant_expression ':' statement
181 | DEFAULT ':' statement
182 compound_statement : '{' '}'
183 | '{' statement_list '}'
184 | '{' declaration_list '}'
185 | '{' declaration_list statement_list '}'
186 declaration_list : declaration
187 | declaration_list declaration
188 statement_list : statement
189 | statement_list statement
190 expression_statement : ';'
191 | expression ';'
192 selection_statement : IF '(' expression ')' statement
193 | IF '(' expression ')' statement ELSE statement
194 | SWITCH '(' expression ')' statement
195 iteration_statement : WHILE '(' expression ')' statement
196 | DO statement WHILE '(' expression ')' ';'
197 | FOR '(' expression_statement expression_statement ')' statement
198 | FOR '(' expression_statement expression_statement expression ')' statement
199 jump_statement : GOTO IDENTIFIER ';'
200 | CONTINUE ';'
201 | BREAK ';'
202 | RETURN ';'
203 | RETURN expression ';'
204 translation_unit : external_declaration
205 | translation_unit external_declaration
206 external_declaration : function_definition
207 | declaration
208 function_definition : declaration_specifiers declarator declaration_list compound_statement
209 | declaration_specifiers declarator compound_statement
210 | declarator declaration_list compound_statement
211 | declarator compound_statement
0 0
- 使用Lex和Yacc开发C语言的编译器
- 使用Lex和Yacc开发C语言的编译器
- 使用Lex和Yacc开发C语言的编译器
- 基于Lex 和 Yacc 的 C 语言编译器
- 基于Lex 和 Yacc 的 C 语言编译器
- LEX和YACC的使用
- C语言的lex和yacc工具说明
- C语言的lex和yacc工具说明
- C语言的lex和yacc工具说明
- C语言的lex和yacc工具说明
- C语言的lex和yacc工具说明
- C语言的lex和yacc工具说明
- LEX和YACC的使用一
- LEX和YACC的使用二
- LEX和YACC的使用三
- 编译器是怎么工作的?使用yacc 和lex 写一个计算器(1)
- 从lex&yacc说到编译器(2.flex的使用)
- Lex和Yacc从入门到精通(5)-开发Lex和Yacc程序的一般步骤
- jQuery.validator验证无效的可能原因
- SQL Server 权限管理
- poj 1204——Word Puzzles
- 基础知识以及数组
- 【解惑】编程到底有什么用?
- 使用Lex和Yacc开发C语言的编译器
- 学习编程有什么前景?
- servlet web3.0文件上传
- 编程是什么?
- poj-1990
- 网络分析工具Wireshark Network Analyzer
- Histogram of Oriented Gradients and Object Detection
- java.lang.NoSuchMethodError: org.springframework.beans.factory.annotation.InjectionMetadata.<init>(L
- 编程技术