免费注册 查看新帖 |

Chinaunix

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

请教GCC的treelang语言的前端分析流程? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-17 00:33 |只看该作者 |倒序浏览
treelang语法分析的大致处理流程如下
main (argc, argv)-> toplev_main (argc, argv) -> do_compile ()
-> compile_file () -> lang_hooks.parse_file (set_yydebug)

lang_hooks注册钩子
const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;

parse_file实际调用treelang_parse_file
LANG_HOOKS_INITIALIZER . LANG_HOOKS_PARSE_FILE
#define LANG_HOOKS_PARSE_FILE treelang_parse_file

调用bison 的parser提取语法tree。GCC真正用的是自己实现的parser,没用bison的。
treelang_parse_file() -> yyparse ()

这里是parse函数定义,
int
yyparse (YYPARSE_PARAM_ARG)
     YYPARSE_PARAM_DECL

{
  /* If reentrant, generate the variables here. */
#if YYPURE
  YY_DECL_VARIABLES
#endif  /* !YYPURE */

  register int yystate;
  register int yyn;
...
...
...
}

#ifdef YYPARSE_PARAM
# if defined (__STDC__) || defined (__cplusplus)
#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
#  define YYPARSE_PARAM_DECL
# else
#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
# endif
#else /* !YYPARSE_PARAM */
# define YYPARSE_PARAM_ARG
# define YYPARSE_PARAM_DECL
#endif /* !YYPARSE_PARAM */

/* Prevent warning if -Wstrict-prototypes.  */
#ifdef __GNUC__
# ifdef YYPARSE_PARAM
int yyparse (void *);
# else
int yyparse (void);
# endif
#endif

#line 315 "/usr/local/share/bison/bison.simple"
#line 175 "plural.y"
#line 183 "plural.y"



有两个疑惑:
1.在
int yyparse (YYPARSE_PARAM_ARG)
     YYPARSE_PARAM_DECL

中有这种函数声明
int yyparse (arg) void *
C语言中有这种语法吗?
2.像__GNUC__,__LINE__这些宏说是操作系统内置的,不知道怎么理解?

[ 本帖最后由 fineamy 于 2009-1-17 00:36 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2009-01-17 11:10 |只看该作者
1.gcc带了一些扩展,但即便如此,1也编译不过去吧,预处理之后就长这样?
2.这种宏去OS其实是没有什么关系的,只与编译器有关系

论坛徽章:
0
3 [报告]
发表于 2009-01-17 11:46 |只看该作者

回复 #2 cjaizss 的帖子

# else
#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
# endif
取这个分支就变成那样了。
记得内核中也有类似函数定义形式。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2009-01-17 11:55 |只看该作者
那是类似
int yyparse (arg) void *arg;
这对于gcc是当然支持的,这种语法很古老,为了代码兼容,所以现在还在支持

论坛徽章:
0
5 [报告]
发表于 2009-01-17 12:44 |只看该作者

回复 #4 cjaizss 的帖子

哦,谢谢。以前没见过这种写法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP