中易网

求一个尽量完整的编译器:词法分析器+语法分析器

答案:3  悬赏:60  
解决时间 2021-02-05 08:08
1.设计扫描程序,将任何一种整数运算表达式(无变量,操作数为正整数,允许加减乘除四种运算,允许使用括号和多层括号)识别为单词,并能发现单词的拼写错误
2.设计自底向上分析程序,在栈上实现对单词token串的自底向上分析
3.根据算符优先文法的分析步骤,展示(最好可视化的展示)分析栈、token串的状态变化、相关量的优先级比较(算符优先分析表) 、判断当前是否进行规约或移进操作、(若须规约)显示当前应规约的串
4. 展示(最好可视化的展示)语法树
5.给出语义子程序序列
能满足前3个条件的即可,急要,明天中午要交,过后就没用了!!!
邮箱[email protected]
最佳答案
在一个模式被匹配之前,词法分析器往往需要超前扫描该词素后面的若干个字符,使用将字符退回输入流的方法,需要移动大量字符的时间,由于 词法分析器是编译期间唯一需要逐一扫描源程序字符的过程,因此它的效率将极大的影响编译器的性能,因此人们发明了双缓冲区的技术。
双缓冲区技术原理如下:
把一个缓冲区分成前后两个部分,每部分能够容纳N(1024/4096)个字符,每次系统读命令读入N个字符到前半部分或者后半部分,如果剩余的不足N个字符,则在最后增加一个不同于其他任何字符的字符,如eof/#,用于标识源文件的结束。缓冲区包括两个指针beginning和forward,在两个指针之间的字符串就是当前的词素。一开始两个指针都指向第一个字符,然后forward向后扫描,直至发现一个匹配的词素为止。如果forward跨过中间标记,则往后半部分读入N个字符。如果forward指针移过最后位置,则向前半部分读入N个字符,且forward指针重新指向开始继续处理过程。为了处理方便在两个部分的最后都增加一个文件结束标识eof。示意图如下:
______________________________________________________________________
|............for......while.... ........................................ |....int i .................................................. ...................| |_______________________________eof|_______________eof________________eof|
| |
beginning forward

下面是双缓冲区的一个c实现:

#include <stdio.h>
#include <string.h>

#define MAXWORD 1000

struct bibuffer
{
char* buffer[2048]; //缓冲区空间
char* beginning,forward; //前向和后向指针
int count; //前向指针记数
} bbuf;

void parse(char c)
{
if(c=' ')
{
memcpy(word[i],beginning,(size_t)(forward-beginning));
i++;
}
else forward++;
}

int main(int argc,char* argv)
{
File* fp;
char* word[MAXWORD];
int i=0;
buffer=new char[2048];
fp=open("test.c","r");
read(fp,buffer,1023);
buffer[1023]='#';
read(fp,buffer+1024,1023);
buffer[2047]='#';
bbuf->buffer=buffer;
bbuf->beginning=bbuf->forward=bbuf->buffer;
bbuf->count=0;
while(1)
{
forward=forward+1;
if(count==1023)
{
read(fp,buffer+1024,1023);
forward++;
//这个函数的具体代码就要和具体的词法分析规则而定,这里假设只识别空格分割的单词
parse(*forward);
}
else if(count>=2048)
{
read(fp,buffer,1023);
forward=bbuf->buffer;
//这个函数的具体代码就要和具体的词法分析规则而定,这里假设只识别空格分割的单词
parse(*forward);
}
else if(count!=1023&&count<2048&&(*forward)='#')
{
break; //词法分析结束
}
}
}
全部回答
我电脑存的有,不过现在电脑不在我这,今天看到也没法发你了,感觉有点抱歉 不过我认为还是自己做比较好。其实是很好做的,大部分代码在课本上都能找到。自己做,查找资料。可以巩固自己的编程能力嘛
这是大学里编译原理的作业,找你同学要。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
老公的父母要贷款,老公拿了我的身份证和结婚
重庆到张家界没有直达,在怀化转车中午到下午
南昌大桥修桥时间
香满楼地址在什么地方,想过去办事
苹果6plus丢失了,如何用另一个手机更换icloud
反弹无量,是怎么回事
中山卡西欧手表折扣店叫什么?
杭州太子湾公园现在要钱吗
excel如何在另外一个单元格求和?
魏字号云吞河南岸分店地址在什么地方,想过去
上路不到1个月!车门底下凹进去,掉漆,漏底
北京市城市轨道交通如何做好防汛工作,以及暴
文志鹏作文阅读地址在什么地方,想过去办事
.攻城略地 我武将单排兵力6000+为什么总兵力
青花瓷酒姜堰店地址有知道的么?有点事想过去
推荐资讯
几斤生石斛才能制成一斤干石斛呢?
求大神帮忙制作小说《归溟剑之天之迹》封面,
微信登录的口袋赚怎么注销啊 体现的支付宝账
辽宁省2015年高考一本录取率是多少
腓比美术社在什么地方啊,我要过去处理事情
 20 大家帮我分析下我喜欢上一个
求银魂主题曲要所有的(包括片尾曲)
沂罗旧货交易中心怎么去啊,有知道地址的么
二冲程发动机就一定比四冲程噪音大吗?
贵州险峰实业总公司怎么去啊,有知道地址的么
麻烦帮我看下我的电脑配置能不能画三维图
交往一个月结婚算闪婚
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?