LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1074|回复: 8

yyarse和yylex是怎样结合的?【Lex&Yacc相关】

[复制链接]
发表于 2006-5-25 13:04:40 | 显示全部楼层 |阅读模式
他们之间是什么关系
或者内部是如何运作的?

高手指点一下啊!
 楼主| 发表于 2006-5-25 14:39:27 | 显示全部楼层
问题已解决,原来是yyin与yyout的缘故。
不过还是希望高手说说他们两个函数之间的运作机制。
回复 支持 反对

使用道具 举报

发表于 2006-5-25 16:48:20 | 显示全部楼层
找个 lex&yacc howto 看看,然后做个小实验,然后再看生成的源码,你就知道大概了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-25 19:59:46 | 显示全部楼层
也不另开主题了,再问楼上的,
文法里的空如何表示?
比如:
[php]
statement_list : statement_list statement
                                        {
                                                YYSTYPE t = $1;
                                                if(t!=NULL)
                                                {
                                                        while(t->sibling!=NULL) t=t->sibling;
                                                        t->sibling = $2;
                                                        $$ = $1;
                                                }
                                                else $$ = $2;
                                        }
                                        | EMPTY{ $$ = NULL;}
                                        ;
[/php]
即允许语句序列为空,如空语句{}.

再如函数调用参数args语句的空:支持func();或func(void);或func(args);
文法:args->arg_list|void|empty
[php]
args : arg_list
                { $$ = $1; }
                |VOID { $$ = NULL; }
                                |EMPTY {$$ = NULL;}

[/php]

上面代码中的EMPTY这个token是虚构的,并没有;不知如何实现?
回复 支持 反对

使用道具 举报

发表于 2006-5-25 20:18:25 | 显示全部楼层
参考一下:
  1. args
  2. : arg_list        { $$ = $1; }
  3. | VOID          { $$ = NULL; }
  4. | /*empty*/  { $$ = NULL; }
  5. ;
复制代码
那个注释提醒设计者这是一个空产生式,可以省略之
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-26 10:39:44 | 显示全部楼层
thanks !
回复 支持 反对

使用道具 举报

发表于 2006-5-28 15:53:22 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2006-5-28 17:45:08 | 显示全部楼层

相当不错,谢谢!
收藏
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-28 18:54:45 | 显示全部楼层
这个我看了,哈哈
谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表