当前位置:首页 » 编程软件 » 编译原理测试代码

编译原理测试代码

发布时间: 2022-08-03 06:37:03

A. 跪求 编译原理实验 中间代码生成(生成四元式)及目标代码生成(汇编语言) 要求可以处理if 及while循环

利用ADC0809采用中断式设计一个温度测控系统,在LED数码显示器上显示温度值,并对温度进行测试和控制

B. 编译原理文法分析

改完了,能文法分析出来了!!
大概 跟你说下 你的错误吧:
出错地点:
1.声明的stack[50]没有初始化;
2.stack的入栈是错误的,按照你的方式,如果原来有TM,再加入T->FN,则M就被挤出来了.(这里很关键,你对照我给你改的再看看)
3.s指针在你入栈操作以后并没有指向栈顶,而是保持了不变,这肯定是有问题的.(传入push函数的时候直接传参数s就好了.)
4.if(*s==*p){***}else{}的else的右括号管辖的范围 有错误

不嫌弃的话,可以去http://blog.csdn.net/fangguanya,我的BLOG,不怎么充实,呵呵,有这个程序的运行结果的. 谢谢 呵呵.
总之你对照我给你改的再看看吧. 我把我的测试输出 也给保留了.你好对照点.
(PS.我用的vs2005,用的时候你改下头申明,其他一样)

// grammar.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
using namespace std;

char * spush(char *stack,char *pt);
bool analyse(char *p);

void main()
{
//将分析串存放在二维数组中
char input[5][10]={"i+i#",
"i*(i+i)#",
"i*i+i#",
"i+*#",
"+i*i#"};
bool flag; //定义一个布尔型的标记量
for(int h=0;h<5;++h)
{
flag=analyse(input[h]);
if(flag) cout<<"恭喜你!"<<input[h]<<"语法分析成功,合法!"<<endl;
else cout<<"对不起!"<<input[h]<<"语法分析失败,非法!"<<endl;
}
int aaa;
cin>>aaa;
}
//定义各一将串逆序入栈的函数
char * spush(char *stack,char *pt)
{
int l=0;
//while循环的作用是将指针指向字符串的末尾,然后再由后向前入栈,从而实现逆序
while(*pt!='\0')
{
pt++;
l++;
}

if (*stack == '#')
{
stack++;
}
while(l)
{
pt--;
char cTempIntoStack = (*pt);
*stack=cTempIntoStack;
stack++;
l--;
}
stack--; //由于前面向前加了一位,要返回
////////////////
return stack;
///////////////////////////////////

}

/*LL(1)分析表
i + * ( ) #
E TM +TM
F i (E)
M TM e e
N e *FN e e
T FN FN
*/

//分析函数
bool analyse(char *p){
char analyseTable[5][6][4]={
"TM", "", "", "TM", "", "",
"i", "", "", "(E)", "", "",
"", "+TM", "", "", "e", "e",
"", "e", "*FN", "", "e", "e",
"FN", "", "", "TN", "", ""
};
char *stack = new char[50]; //定义一个栈空间
for (int iStack = 0;iStack<50 ;iStack++)
{
stack[iStack] = 0;
}
char *s=stack; //用指针*s指向栈的起始地址
*s='#'; //将“#”入栈
s++; //指针加1
*s='E'; //将“E”入栈
//下面的while循环实现字符串的词法分析操作

int count = 0;

while(*s!='#' || *p!='#'){
count++;
char * temp = s;
cout<<"NO."<<count<<endl;
cout<<"STACK"<<endl;
while (*temp != '#')
{
cout<<*temp<<" ";
temp--;
}
cout<<endl;

int x,y;
//若果栈顶数据和分析串的字符匹配,则将符号栈的栈顶数据出栈(即将栈顶指针减1)
if(*s==*p){
cout<<"Before :"<<*s<<endl;
s--;
p++;
cout<<"After :"<<*s<<endl;
}
//当符号栈和分析串的字符不匹配时,查分析表
else {
switch(*s){
case 'E':x=0;break;
case 'F':x=1;break;
case 'M':x=2;break;
case 'N':x=3;break;
case 'T':x=4;break;
default:return false;
}
switch(*p){
case 'i':y=0;break;
case '+':y=1;break;
case '*':y=2;break;
case '(':y=3;break;
case ')':y=4;break;
case '#':y=5;break;
default:return false;
}
//若果对应的为空,则分析串非法,退出
if(analyseTable[x][y][0]=='\0') return false;
//若查表所对应的为'e',则将符号栈的栈顶数据出栈
else if(analyseTable[x][y][0]=='e') s--;
//其它,这时将查表所得的项逆序入符号栈
else {
s=spush(s,analyseTable[x][y]);
}
}
}
return true; //分析成功,返回
}

C. C语言编译原理是什么

编译共分为四个阶段:预处理阶段、编译阶段、汇编阶段、链接阶段。

1、预处理阶段:

主要工作是将头文件插入到所写的代码中,生成扩展名为“.i”的文件替换原来的扩展名为“.c”的文件,但是原来的文件仍然保留,只是执行过程中的实际文件发生了改变。(这里所说的替换并不是指原来的文件被删除)

2、汇编阶段:

插入汇编语言程序,将代码翻译成汇编语言。编译器首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,编译器把代码翻译成汇编语言,同时将扩展名为“.i”的文件翻译成扩展名为“.s”的文件。

3、编译阶段:

将汇编语言翻译成机器语言指令,并将指令打包封存成可重定位目标程序的格式,将扩展名为“.s”的文件翻译成扩展名为“.o”的二进制文件。

4、链接阶段:

在示例代码中,改代码文件调用了标准库中printf函数。而printf函数的实际存储位置是一个单独编译的目标文件(编译的结果也是扩展名为“.o”的文件),所以此时主函数调用的时候,需要将该文件(即printf函数所在的编译文件)与hello world文件整合到一起,此时链接器就可以大显神通了,将两个文件合并后生成一个可执行目标文件。

D. 编译原理

我刚回答的那个编译原理应该也是你提的问吧,呵呵
其实你只需要合在一起提问就行了,你这样不就省了分吗?

挺敬重你不求甚解的学问精神,加油吧!

E. 编译原理 实验 题目是 用C语言编写语法分析以及中间代码生成程序

这是一个大工程,我们也正在做编译原理,我做完了语法分析,你自己看书做吧

F. 编译原理 语义分析 算术表达式求值代码

java字符串算术表达式求值:importjava.util.ArrayList;importjava.util.Stack;/****@authoryhh**/publicclassCalculate{/***将字符串转化成List*@paramstr*@return*/publicArrayListgetStringList(Stringstr){ArrayListresult=newArrayList();Stringnum="";for(inti=0;igetPostOrder(ArrayListinOrderList){ArrayListresult=newArrayList();Stackstack=newStack();for(inti=0;ipostOrder){Stackstack=newStack();for(inti=0;i

G. 急求编译原理词法分析器代码 C++做的

我把自己很久以前写的给你····

#include <iostream>
#include<iomanip>
using namespace std;
#define max 1000 //用户输入字符串的最大长度
struct ID
{
char name[8]; //存放标识符的字符数组
int addr; //单词在单词表中的地址
}indent[100]; //标识符
char A[8]; //工作数组
int K=0; //读入的标识符个数
int I=0; //标识符读入的字符个数
bool cz=true;//cun zai
char buf[max];
char Null[8]=" "; //used for clear work array
void main()
{
cout<<"Input your string:"<<endl;
cin>>buf;
strcpy(A,Null);
for(int i=0;i<strlen(buf);i++)
{
if(buf[i]==';')
{
for(int j=0;j<K;j++) //Is it exsited?
if(strcmp(A,indent[j].name)==0)
cz=false;
if(cz&&I!=0)
{
strcpy(indent[K].name,A);
indent[K].addr=100+K;
K++;
}
I=0;
cz=true;
strcpy(A,Null);
if(K>0)
{
cout<<"name: "<<setw(10)<<"addr:"<<endl;
for(j=0;j<K;j++)
cout<<indent[j].name<<setw(10)<<indent[j].addr<<endl;;

}
break;//In case dealing with the char behind ;Output a new table ,ignore chars behind;
}

else if(buf[i]==',')
{
if(I>0)
{
for(int j=0;j<K;j++)
if(strcmp(A,indent[j].name)==0)
cz=false;
if(cz&&I!=0)
{
strcpy(indent[K].name,A);
indent[K].addr=100+K;
K++;
}
I=0;
cz=true;
strcpy(A,Null);
}
}
else if((buf[i]<='z'&&buf[i]>='a')||(buf[i]<='Z'&&buf[i]>='A'))
{
A[I]=buf[i];
I++;
}
else if(buf[i]<='9'&&buf[i]>='0')
{
if(I==0)
{
cout<<"The "<<K+1<<" ident first char can not be num!"<<endl;
while((buf[i]!=',')&&(buf[i]!=';'))
{
i++;
}
i--;
}
else if(I>0)
{
A[I]=buf[i];
I++;
}
}
else
{
cout<<"The "<<K+1<<" ident contained illeagl char(s)!"<<endl;
while((buf[i]!=',')&&(buf[i]!=';'))
{
i++;
}
i--;
}
}
int choose;
cout<<"continue?press 0."<<endl;
cin>>choose;
if(choose==0)
main();//Data Structer should be clear,or will be wrong.
}

热点内容
乘法多种算法 发布:2024-05-10 12:26:44 浏览:780
ps2021怎么存储为web格式 发布:2024-05-10 12:26:41 浏览:663
苹果手机怎么清理其他内存和缓存 发布:2024-05-10 12:26:40 浏览:628
白车黑顶xc40是哪个配置 发布:2024-05-10 12:15:53 浏览:536
没有设密码格式不正确是什么意思 发布:2024-05-10 12:15:50 浏览:807
存储系统Ceph 发布:2024-05-10 12:02:02 浏览:295
linux是几位 发布:2024-05-10 11:32:53 浏览:877
虎牙直播安卓投屏用什么软件 发布:2024-05-10 11:31:30 浏览:835
桃源码头电话 发布:2024-05-10 11:27:44 浏览:72
编译器连接地址是内存地址 发布:2024-05-10 11:16:34 浏览:524