免费注册 查看新帖 |

Chinaunix

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

去除左递归的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-20 12:58 |只看该作者 |倒序浏览
请教有关C语法的问题

1、对于C语言语法里的 declarator 和 abstract_declarator,以及其相关的direct_declarator 和 direct_abstract_declarator 的C语言语法如下:

=============================================================================================
1)declarator
        : pointer direct_declarator
        | direct_declarator
        ;

2)direct_declarator
        : IDENTIFIER
        | '(' declarator ')'
        | direct_declarator '[' constant_expression ']'
        | direct_declarator '[' ']'
        | direct_declarator '(' parameter_type_list ')'
        | direct_declarator '(' identifier_list ')'
        | direct_declarator '(' ')'
        ;

3)abstract_declarator
        : pointer
        | direct_abstract_declarator
        | pointer direct_abstract_declarator
        ;

4)direct_abstract_declarator
        : '(' abstract_declarator ')'
        | '[' ']'
        | '[' constant_expression ']'
        | direct_abstract_declarator '[' ']'
        | direct_abstract_declarator '[' constant_expression ']'
        | '(' ')'
        | '(' parameter_type_list ')'
        | direct_abstract_declarator '(' ')'
        | direct_abstract_declarator '(' parameter_type_list ')'
        ;

============================================================================================


2、对于以上4条语法,在去左递归后,变为如下:
============================================================================================
1)declarator不存在左递归

2)direct_declarator        : IDENTIFIER R
                        | '(' declarator ')' R
                        ;

                R        : '[' constant_expression ']' R
                        | '[' ']' R
                        | '(' parameter_type_list ')' R
                        | '(' identifier_list ')' R
                        | '(' ')' R
                        | Ɛ
                        ;                                       

3)abstract_declarator不存在左递归,但为了方便分析,转换为如下:

abstract_declarator        : A B
                        ;

                A        : pointer
                        | Ɛ
                        ;

                B        : direct_abstract_declarator
                        | Ɛ
                        ;

4)direct_abstract_declarator        : '(' abstract_declarator ')' R
                                | '[' ']' R
                                | '[' constant_expression ']' R
                                | '(' ')' R
                                | '(' parameter_type_list ')' R
                                                                ;

                        R         : '[' ']' R
                                | '[' constant_expression ']' R
                                | '(' parameter_type_list ')' R
                                | '(' ')' R
                                | Ɛ
                                ;       
============================================================================================


3、问题


1)对于上面第2中的2)、4)的“去左递归”的转换是否正确?

论坛徽章:
0
2 [报告]
发表于 2013-05-20 13:00 |只看该作者
回复 1# landker

ding
   

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2013-07-02 14:25 |只看该作者
回复 1# landker
正确

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:53:17
4 [报告]
发表于 2013-07-03 16:21 |只看该作者
2)

direct_declarator
  : IDENTIFIER
  | '(' declarator ')'
  | IDENTIFIER R
  | '(' declarator ')' R
  ;

R
  : '[' constant_expression ']'
  | '[' ']'
  | '(' parameter_type_list ')'
  | '(' identifier_list ')'
  | '(' ')'
  | '[' constant_expression ']' R
  | '[' ']' R
  | '(' parameter_type_list ')' R
  | '(' identifier_list ')' R
  | '(' ')' R
  ;

让规则R不可匹配空规则,这样写还对么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP