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

(1) 从网站:http://www.lysator.liu.se/c/ 下载C语言的语法文件:
The ANSI C grammar ( Yacc and Lex)
(2) 编译词法文件:
> lexc.l
(3) 编译语法文件:
> yacc-dvc . y
说明:-d:产生头文件y.yab.h,-v:产生分析表y.output。针对else产生的移进规约冲突,采用了yacc的默认动作“移进”解决。
(4) 编译语法分析器:
> cclex . yy . cy . tab . c-ll
(5) 测试:
编写测试程序test.c
#include " stdio.h "
int main() ... {
inta=0;
for(;a<10;a++)...{
printf(
"hellofromsun! ");
}

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

结果如下:
" stdio.h "
int () ... {
int=;
for(;<;++)...{
int("hellofromsunhonghao! ");
}

}


发现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_expressionPTR_OPIDENTIFIER
11 |postfix_expressionINC_OP
12 |postfix_expressionDEC_OP

13 argument_expression_list:assignment_expression
14 |argument_expression_list' , 'assignment_expression

15 unary_expression:postfix_expression
16 |INC_OPunary_expression
17 |DEC_OPunary_expression
18 |unary_operatorcast_expression
19 |SIZEOFunary_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_expressionLEFT_OPadditive_expression
38 |shift_expressionRIGHT_OPadditive_expression

39 relational_expression:shift_expression
40 |relational_expression' < 'shift_expression
41 |relational_expression' > 'shift_expression
42 |relational_expressionLE_OPshift_expression
43 |relational_expressionGE_OPshift_expression

44 equality_expression:relational_expression
45 |equality_expressionEQ_OPrelational_expression
46 |equality_expressionNE_OPrelational_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_expressionAND_OPinclusive_or_expression

55 logical_or_expression:logical_and_expression
56 |logical_or_expressionOR_OPlogical_and_expression

57 conditional_expression:logical_or_expression
58 |logical_or_expression'?'expression':'conditional_expression

59 assignment_expression:conditional_expression
60 |unary_expressionassignment_operatorassignment_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_specifiersinit_declarator_list' ; '

77 declaration_specifiers:storage_class_specifier
78 |storage_class_specifierdeclaration_specifiers
79 |type_specifier
80 |type_specifierdeclaration_specifiers
81 |type_qualifier
82 |type_qualifierdeclaration_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_unionIDENTIFIER'{'struct_declaration_list'}'
105 |struct_or_union'{'struct_declaration_list'}'
106 |struct_or_unionIDENTIFIER

107 struct_or_union:STRUCT
108 |UNION

109 struct_declaration_list:struct_declaration
110 |struct_declaration_liststruct_declaration

111 struct_declaration:specifier_qualifier_liststruct_declarator_list' ; '

112 specifier_qualifier_list:type_specifierspecifier_qualifier_list
113 |type_specifier
114 |type_qualifierspecifier_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 |ENUMIDENTIFIER'{'enumerator_list'}'
123 |ENUMIDENTIFIER

124 enumerator_list:enumerator
125 |enumerator_list' , 'enumerator

126 enumerator:IDENTIFIER
127 |IDENTIFIER' = 'constant_expression

128 type_qualifier:CONST
129 |VOLATILE

130 declarator:pointerdirect_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_listpointer

143 type_qualifier_list:type_qualifier
144 |type_qualifier_listtype_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_specifiersdeclarator
150 |declaration_specifiersabstract_declarator
151 |declaration_specifiers

152 identifier_list:IDENTIFIER
153 |identifier_list' , 'IDENTIFIER

154 type_name:specifier_qualifier_list
155 |specifier_qualifier_listabstract_declarator

156 abstract_declarator:pointer
157 |direct_abstract_declarator
158 |pointerdirect_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 |CASEconstant_expression':'statement
181 |DEFAULT':'statement

182 compound_statement:'{''}'
183 |'{'statement_list'}'
184 |'{'declaration_list'}'
185 |'{'declaration_liststatement_list'}'

186 declaration_list:declaration
187 |declaration_listdeclaration

188 statement_list:statement
189 |statement_liststatement

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 statementWHILE' ( 'expression' ) '' ; '
197 | FOR ' ( 'expression_statementexpression_statement' ) 'statement
198 | FOR ' ( 'expression_statementexpression_statementexpression' ) 'statement

199 jump_statement: GOTO IDENTIFIER' ; '
200 |CONTINUE' ; '
201 | BREAK ' ; '
202 | RETURN ' ; '
203 | RETURN expression' ; '

204 translation_unit:external_declaration
205 |translation_unitexternal_declaration

206 external_declaration:function_definition
207 |declaration

208 function_definition:declaration_specifiersdeclaratordeclaration_listcompound_statement
209 |declaration_specifiersdeclaratorcompound_statement
210 |declaratordeclaration_listcompound_statement
211 |declaratorcompound_statement
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值