免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1932 | 回复: 1
打印 上一主题 下一主题

c编译器的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-27 13:49 |只看该作者 |倒序浏览
本帖最后由 kallytin 于 2013-04-27 13:50 编辑

目前在做一些语法分析的东东(之前都是使用yacc去辅助,但这次要自己写,烦。编译原理也忘记的差不多了....),碰到一些问题,如下:

请教对于C语言的postfix_expression,是如何计算它的 First集 和 Follow集 的?

附上C的语法(C语言的yacc的文件) c_grammar.txt.zip (1.85 KB, 下载次数: 4) 。以下是我的分析


//假设$是带分析字符串的最后符号(是分析是手工加上去的)
  1. ============================================================
  2. (1) 转换成LL(1):
  3.         postfix_expression R
  4.                         : primary_expression R
  5.                         ;

  6.                 R        : '[' expression ']' R
  7.                         | '(' ')' R
  8.                         | '(' argument_expression_list R
  9.                         | '.' IEDNTIFIER R
  10.                         | PTR_OP IDENTIFIER R
  11.                         | INC_OP R
  12.                         | DEC_OP R
  13.                         |Ɛ
  14.                         ;

  15. (2) First Set
  16.         First( postfix_expression) = First( primary_expression)

  17.         First(R) = First(PTR_OP) U First(INC_OP) U First(DEC_OP) U {'[', '(', '.'}
  18.                  = {PTR_OP, INC_OP, DEC_OP, '[', '(', '.'}

  19.         First( primary_expression) = {IDENTIFIER, CONSTANT, STRING_LITERAL, '('}

  20.         First(expression) =

  21.         First(argument_expression_list) =

  22. (3) Follow Set
  23.         Follow(R) = {$}       

  24. ============================================================

  25. 对于,First(expression) 和 First(argument_expression_list),该如何分析?

  26. 我的分析如下:
  27. ============================================================
  28. 1、根据:
  29.         expression         : assignment_expression
  30.                         | expression ',' assignment_expression
  31.                         ;

  32. (1) 转换成LL(1)
  33.         expression         : assignment_expression R
  34.                         ;

  35.               R         : ',' assignment_expression R
  36.                         |Ɛ
  37.                         ;

  38. (2) First Set
  39.         First(expression) = First(assignment_expression)
  40.         First(R) = {','}
  41.        
  42. (3) Follow Set
  43.         Follow(R) = {$}

  44. 得出:
  45.         First(expression) 依赖于: First(assignment_expression)

  46. ---------------------------------------------------------

  47. 2、根据:
  48.         argument_expression_list
  49.                         : assignment_expression
  50.                         | argument_expression_list ',' assignment_expression
  51.                         ;

  52. (1) 转换成LL(1):
  53.         argument_expression_list
  54.                         : assignment_expression R
  55.                         ;

  56.                 R        : ',' assignment_expression R
  57.                         |Ɛ
  58.                         ;

  59. (2) First Set
  60.         First(argument_expression_list) = First(assignment_expression)
  61.         First(R) = {','}
  62.        
  63. (3) Follow Set
  64.         Follow(R) = {$}

  65. 得出:
  66.         First(argument_expression_list) 依赖于: First(assignment_expression)

  67. ============================================================

  68. 也就是:
  69. 无论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),
  70. 即:
  71. First(assignment_expression) 依赖于: First(cast_expression)

  72. ============================================================
  73. 3、根据:
  74.                 cast_expression
  75.                         : unary_expression
  76.                         | '(' type_name ')' cast_expression
  77.                         ;

  78. (1) 转换成LL(1)
  79. (2) First Set
  80.                 First(cast_expression)        = First(unary_expression) U {'('}
  81.                 First(unary_expression) =
  82.                 First(type_name)        =
  83. (3) Follow Set

  84. 得出:
  85.                 First(cast_expression) 依赖于: First(unary_expression) 和 First(type_name)

  86. 4、根据:
  87.                 unary_expression
  88.                         : postfix_expression
  89.                         | INC_OP unary_expression
  90.                         | DEC_OP unary_expression
  91.                         | unary_operator cast_expression
  92.                         | SIZEOF unary_expression
  93.                         | SIZEOF '(' type_name ')'
  94.                         ;

  95. (1) 转换成LL(1):

  96. (2) First Set
  97.                 First(unary_expression) = First(postfix_expression) U First(INC_OP) U First(DEC_OP) U
  98.                                                         First(unary_operator) U First(SIZEOF)
  99.                                         = First(postfix_expression) U First(unary_operator) U {INC_OP, DEC_OP, SIZEOF}
  100.                                         = First(postfix_expression) U {'&', '*', '+', '-', '~', '!'} U {INC_OP, DEC_OP, SIZEOF}
  101.                                         = First(postfix_expression) U {'&', '*', '+', '-', '~', '!', INC_OP, DEC_OP, SIZEOF}

  102.                 First(postfix_expression) =
  103.                                                   
  104.                 First(unary_operator) = {'&', '*', '+', '-', '~', '!'}
  105.                 First(cast_expression) =
  106.                 First(type_name) =
  107. (3) Follow Set

  108. 得出:
  109.         First(unary_expression) 依赖于: First(postfix_expression) 和 First(cast_expression) 和 First(type_name)
  110. ============================================================

  111. 后面的First(type_name)我先不算了,因为我发现原来要求的 postfix_expression 的First集,它最终是依赖于First(postfix_expression) 和 First(cast_expression) 和 First(type_name)。这是否形成了一个“回路”?是否我算错了?
复制代码

论坛徽章:
0
2 [报告]
发表于 2013-04-27 13:57 |只看该作者
回复 1# kallytin


    dddddddd
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP