- 论坛徽章:
- 0
|
本帖最后由 kallytin 于 2013-04-27 13:50 编辑
目前在做一些语法分析的东东(之前都是使用yacc去辅助,但这次要自己写,烦。编译原理也忘记的差不多了....),碰到一些问题,如下:
请教对于C语言的postfix_expression,是如何计算它的 First集 和 Follow集 的?
附上C的语法(C语言的yacc的文件)
c_grammar.txt.zip
(1.85 KB, 下载次数: 4)
。以下是我的分析
//假设$是带分析字符串的最后符号(是分析是手工加上去的)- ============================================================
- (1) 转换成LL(1):
- postfix_expression R
- : primary_expression R
- ;
- R : '[' expression ']' R
- | '(' ')' R
- | '(' argument_expression_list R
- | '.' IEDNTIFIER R
- | PTR_OP IDENTIFIER R
- | INC_OP R
- | DEC_OP R
- |Ɛ
- ;
- (2) First Set
- First( postfix_expression) = First( primary_expression)
- First(R) = First(PTR_OP) U First(INC_OP) U First(DEC_OP) U {'[', '(', '.'}
- = {PTR_OP, INC_OP, DEC_OP, '[', '(', '.'}
- First( primary_expression) = {IDENTIFIER, CONSTANT, STRING_LITERAL, '('}
- First(expression) =
- First(argument_expression_list) =
- (3) Follow Set
- Follow(R) = {$}
- ============================================================
- 对于,First(expression) 和 First(argument_expression_list),该如何分析?
- 我的分析如下:
- ============================================================
- 1、根据:
- expression : assignment_expression
- | expression ',' assignment_expression
- ;
- (1) 转换成LL(1)
- expression : assignment_expression R
- ;
- R : ',' assignment_expression R
- |Ɛ
- ;
- (2) First Set
- First(expression) = First(assignment_expression)
- First(R) = {','}
-
- (3) Follow Set
- Follow(R) = {$}
- 得出:
- First(expression) 依赖于: First(assignment_expression)
- ---------------------------------------------------------
- 2、根据:
- argument_expression_list
- : assignment_expression
- | argument_expression_list ',' assignment_expression
- ;
- (1) 转换成LL(1):
- argument_expression_list
- : assignment_expression R
- ;
- R : ',' assignment_expression R
- |Ɛ
- ;
- (2) First Set
- First(argument_expression_list) = First(assignment_expression)
- First(R) = {','}
-
- (3) Follow Set
- Follow(R) = {$}
- 得出:
- First(argument_expression_list) 依赖于: First(assignment_expression)
- ============================================================
- 也就是:
- 无论First(expression)还是First(argument_expression_list),都需要先求出First(assignment_expression)。那根据assignment_expression,conditional_expression,logical_or_expression,logical_and_expression,inclusive_or_expression,exclusive_or_expression,and_expression,equality_expression,relational_expression,shift_expression,additive_expression,multiplicative_expression 和 cast_expression,最后发现如果要求出First(assignment_expression),则先要求出First(cast_expression),
- 即:
- First(assignment_expression) 依赖于: First(cast_expression)
- ============================================================
- 3、根据:
- cast_expression
- : unary_expression
- | '(' type_name ')' cast_expression
- ;
- (1) 转换成LL(1)
- (2) First Set
- First(cast_expression) = First(unary_expression) U {'('}
- First(unary_expression) =
- First(type_name) =
- (3) Follow Set
- 得出:
- First(cast_expression) 依赖于: First(unary_expression) 和 First(type_name)
- 4、根据:
- unary_expression
- : postfix_expression
- | INC_OP unary_expression
- | DEC_OP unary_expression
- | unary_operator cast_expression
- | SIZEOF unary_expression
- | SIZEOF '(' type_name ')'
- ;
- (1) 转换成LL(1):
- (2) First Set
- First(unary_expression) = First(postfix_expression) U First(INC_OP) U First(DEC_OP) U
- First(unary_operator) U First(SIZEOF)
- = First(postfix_expression) U First(unary_operator) U {INC_OP, DEC_OP, SIZEOF}
- = First(postfix_expression) U {'&', '*', '+', '-', '~', '!'} U {INC_OP, DEC_OP, SIZEOF}
- = First(postfix_expression) U {'&', '*', '+', '-', '~', '!', INC_OP, DEC_OP, SIZEOF}
- First(postfix_expression) =
-
- First(unary_operator) = {'&', '*', '+', '-', '~', '!'}
- First(cast_expression) =
- First(type_name) =
- (3) Follow Set
- 得出:
- First(unary_expression) 依赖于: First(postfix_expression) 和 First(cast_expression) 和 First(type_name)
- ============================================================
- 后面的First(type_name)我先不算了,因为我发现原来要求的 postfix_expression 的First集,它最终是依赖于First(postfix_expression) 和 First(cast_expression) 和 First(type_name)。这是否形成了一个“回路”?是否我算错了?
复制代码 |
|