使用Lex和Yacc开发C语言的编译器

9 篇文章 0 订阅
(1) 从网站:http://www.lysator.liu.se/c/  下载C语言的语法文件:
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! ");
    }

}
运行:
>  . / a. out   <  test.c

结果如下:
  " stdio.h "
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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值