首页
社区
课程
招聘
[求助]lex&yacc:如何纯解释执行分支循环语句??
发表于: 2007-2-23 12:18 5454

[求助]lex&yacc:如何纯解释执行分支循环语句??

2007-2-23 12:18
5454
想写个类C脚本解释器,我想纯解释执行,边分析语法边执行,不生成中间代码和虚拟机

顺序执行都比较容易,直接在expression规则里写执行代码就行了
但分支循环不好处理,比如if(expression){statement}语句,自下而上的分析,先执行的是expression和statement的语义代码,这样在statement的语义代码里就不知道这是个条件语句
由于自下而上,总是无法预先知道情况
是否应该将statement的脚本代码文本提取出来另由一分析器执行,或者由分析器递归调用自己,以便形成一个自上而下的机制?yacc&lex环境里要怎么提取文本呢?
有没有相关的参考文章?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
网上资料不多
自带的帮助和示例研究研究?
2007-2-26 23:10
0
雪    币: 296
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不知道这篇文章能不能帮上忙.....

http://www.codeguru.com/csharp/.net/net_general/patterns/article.php/c12805
2007-2-27 10:33
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
4
谢谢,这个问题解决了

if是通过设置一个全局skip变量解决,所有的expression都首先判断skip,若不位零则不执行语义

while可以改变lex的文本缓冲区指针解决,不过这一方法要用到lex.cpp中非文档化的变量,可能只使用于特定版本,并且文本输入只能是内存缓冲区模式不能是FILE*yyin模式,因为FILE模式时只是部分文本在内存中
改变文本缓冲区的函数:
int resetloop(char*text)
{
*yy_c_buf_p=yy_hold_char;
yy_c_buf_p=text;
yy_hold_char=*text;
return 1;
}
char*text可由yytext获得,yytext正是"while"的首地址,且yytext就指向文本缓冲区内,yy_hold_char是yytext末尾的"\0"原先的字符,这是为了直接在文本缓冲区中形成yytext
"while"   {yylval.state=(int)yytext;return WHILE;}
2007-2-27 13:26
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
文章我倒是不知道,PL Compiler 我没学过(汗颜)
现成品我倒是知道一些

http://ppodsiad.home.cern.ch/ppodsiad/seer/
http://mamaich.uni.cc/old_site.htm

etc...
2007-2-28 00:41
0
雪    币: 10
活跃值: (130)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
需要二次扫描~
2007-3-3 19:41
0
游客
登录 | 注册 方可回帖
返回
//