请教GCC的treelang语言的前端分析流程?

发布于 2022-09-23 14:32:34 字数 2253 浏览 11 评论 0

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 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

阪姬 2022-09-30 14:32:34

1.gcc带了一些扩展,但即便如此,1也编译不过去吧,预处理之后就长这样?
2.这种宏去OS其实是没有什么关系的,只与编译器有关系

烏雲後面有陽光 2022-09-30 14:32:34

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

青春有你 2022-09-30 14:32:34

那是类似
int yyparse (arg) void *arg;
这对于gcc是当然支持的,这种语法很古老,为了代码兼容,所以现在还在支持

離殇 2022-09-30 14:32:34

哦,谢谢。以前没见过这种写法。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文