急(高悬赏 帮个忙) 求编译原理课程设计---c语言实现c-的语法分析,在线等

望有程序的拿出来啊 !
简单解释下总体思路
要求能实现一个简单程序的语法分析,输出为语法分析树。
大家踊跃点啊

新建一个文本文档在你工程目录下,名字起为"输入.txt",里面的内容可以为
begin a:=1+7*(6+3);b:=1end#

输出是在"输出.txt"中查看,以下为输出情况:

词法分析结果如下:
(1, begin)
(10, a)
(18, :=)
(11, 1)
(13, +)
(11, 7)
(15, *)
(27, ()
(11, 6)
(13, +)
(11, 3)
(28, ))
(26, ;)
(10, b)
(18, :=)
(11, 1)
(6, end)
(0, #)
语法分析结果如下:(以四元式形式输出)
( +, 6, 3, t1)

( *, 7, t1, t2)

( +, 1, t2, t3)

( =, t3, __, a)

( =, 1, __, b)

//提供一个编译原理的语义分析程序 你可以直接复制 用TC进行调试
#include "stdio.h"
#include "string.h"
#include <malloc.h>
#include <conio.h>
#include "stdlib.h"

char prog[100],token[8],ch;
char *rwtab[6]={"begin","if","then","while","do","end"};
int syn,p,m,n,sum,q;
int kk;
//四元式表的结构如下:
struct
{
char result1[8];
char ag11[8];
char op1[8];
char ag21[8];
}quad[20];

char *factor();
char *expression();
int yucu();
char *term();
int statement();
int lrparser();
char *newtemp();
void scaner();
void emit(char *result,char *ag1,char *op,char *ag2);

void main()
{
FILE *fp1,*fp2;

if((fp1=fopen("输入.txt","rt"))==NULL)
{
printf("Cannot open 输入.txt\n");
getch();
exit(1);
}
if((fp2=fopen("输出.txt","wt+"))==NULL)
{
printf("Cannot create 输出.txt FILE.strike any key exit");
getch();
exit(1);
}

int j;
q=p=kk=0;
p=0;
//printf("Please Input a String(end with '#'):\n");
while(ch!='#')
{
ch = fgetc(fp1);
if(ch == EOF)
{
printf("文件为空,请检查后再尝试!");
return ;
}

prog[p++]=ch;
}
if(prog[p]=='#')
{
printf("输入的待分析的串不是以'#'结尾,请修改之后再尝试!\n");
return;
}
p=0;
char buffer1[200] = {0};
sprintf(buffer1,"词法分析结果如下:\n");
fputs(buffer1,fp2);
//printf("词法分析结果如下:\n");
do
{
scaner();
switch(syn)
{
case 11:
//printf("(%d,%d)\n",syn,sum);
sprintf(buffer1,"(%d, %d) \n",syn,sum);
fputs(buffer1,fp2);
break;
default:
//printf("(%d,%s)\n",syn,token);
sprintf(buffer1,"(%d, %s)\n",syn,token);
fputs(buffer1,fp2);
break;
}
}while(syn!=0);
printf("\n");

p=0;
char buffer[200]={0};
sprintf(buffer,"语法分析结果如下:(以四元式形式输出)\n");
fputs(buffer,fp2);
//printf("语法分析结果如下:(以四元式形式输出)\n");
scaner();//扫描函数
lrparser();
if(q>19)
printf(" to long sentense!\n");
else
{

for (j=0;j<q;j++)
{
//printf("( %s, %s, %s, %s) \n\n",quad[j].op1,quad[j].ag11,quad[j].ag21,quad[j].result1);
sprintf(buffer,"( %s, %s, %s, %s) \n\n",quad[j].op1,quad[j].ag11,quad[j].ag21,quad[j].result1);
fputs(buffer,fp2);
}
}
printf("已把相应的词法和语法的结果保存到相应的文件中,请查阅!\n");
fclose(fp1);
fclose(fp2);
}
int lrparser()
{
int schain=0;
kk=0;
if (syn==1) //得到begin
{
scaner();//扫描下个字符
schain=yucu();
if(syn==6)//得到end
{
scaner();//扫描下个字符
if((syn==0)&&(kk==0)) //得到#
printf("Success!\n");
}
else
{
if(kk!=1)
printf("short of 'end' !\n");
kk=1;
getch();
exit(0);
}
}
else
{
printf("short of 'begin' !\n");
kk=1;
getch();
exit(0);
}
return (schain);
}
int yucu()
{
int schain=0;
schain=statement();
while(syn==26)
{
scaner();
schain=statement();
}
return (schain);
}
int statement()
{
char tt[8],eplace[8];
int schain=0;
if (syn==10)
{
strcpy(tt,token); //tt中保存的是第一个字符
scaner();
if(syn==18) //检测到=号
{
scaner();
strcpy(eplace,expression());
emit(tt,eplace,"=","__");
schain=0;
}
else
{
printf("short of sign ':=' !\n");
kk=1;
getch();
exit(0);
}
return (schain);
}
}
char *expression()
{
char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt=(char *)malloc(12);

strcpy(eplace,term());

while((syn==13)||(syn==14))
{
if (syn==13)
strcpy(tt,"+");
else
strcpy(tt,"-");

scaner();
strcpy(ep2,term());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return (eplace);
}
char *term()
{
char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt=(char *)malloc(12);

strcpy(eplace,factor());

while((syn==15)||(syn==16))
{
if (syn==15)
strcpy(tt,"*");
else
strcpy(tt,"/");
scaner();
strcpy(ep2,factor());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return (eplace);
}
char *factor()
{
char *fplace;
fplace=(char *)malloc(12);
strcpy(fplace,"");

if(syn==10) //得到字符
{
strcpy(fplace,token);
scaner();
}
else if(syn==11) //得到数字
{
itoa(sum,fplace,10);
scaner();
}
else if(syn==27) //得到)
{
scaner();
fplace=expression();
if(syn==28) //得到(
scaner();
else
{
printf("error on ')' !\n");
kk=1;
getch();
exit(0);
}
}
else
{
printf("error on '(' !\n");
kk=1;
getch();
exit(0);
}
return (fplace);
}
//该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2...
char *newtemp()
{
char *p;
char m[8];
p=(char *)malloc(8);

kk++;
itoa(kk,m,10);
strcpy(p+1,m);
p[0]='t';
return(p); //设置中间变量名放在一个字符数组中,字符数组的第一个字符为t第二个字符为m表示的数值
}
void scaner()
{
sum=0;
///for(m=0;m<8;m++)
//token[m++]=NULL;
memset(token,0,8);
m=0;
ch=prog[p++];
while(ch==' ')
ch=prog[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{
while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{
token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
token[m++]='\0';
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else if((ch>='0')&&(ch<='9'))
{
while((ch>='0')&&(ch<='9'))
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
else switch(ch)
{
case '<':m=0;
ch=prog[p++];
if(ch=='>')
{
syn=21;
}
else if(ch=='=')
{
syn=22;
}
else
{
syn=20;
p--;
}
break;
case '>':m=0;
ch=prog[p++];
if(ch=='=')
{
syn=24;
}
else
{
syn=23;
p--;
}
break;
case ':':m=0;
token[m++] = ch;
ch=prog[p++];
if(ch=='=')
{
syn=18;
token[m++] = ch;
}
else
{
syn=17;
p--;
}
break;

case '+': syn=13;token[0] = ch; break;
case '-': syn=14;token[0] = ch; break;
case '*': syn=15;token[0] = ch;break;
case '/': syn=16;token[0] = ch;break;
case '(': syn=27;token[0] = ch;break;
case ')': syn=28;token[0] = ch;break;
case '=': syn=25;token[0] = ch;break;
case ';': syn=26;token[0] = ch;break;
case '#': syn=0;token[0] = ch;break;
default: syn=-1;break;
}
}
//该函数是生成一个三地址语句送到四元式表中
void emit(char *result,char *ag1,char *op,char *ag2)
{
strcpy(quad[q].result1,result);
strcpy(quad[q].ag11,ag1);
strcpy(quad[q].op1,op);
strcpy(quad[q].ag21,ag2);
q++; //统计有多少个四元式
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-06-17
语法规则及函数模块如下所示:
int do_stat()
{
int es=0;
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=statement();
if (es>0) return(es);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if(strcmp(token,"while")==0)
{
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if(strcmp(token,"(")) return(es=5);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,")")) return(es=6);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
}
else es=3;
return(es);
}
//<声明语句> ::=int <变量>|<变量>;
//<declaration_stat>::=int ID,{ID};
int declaration_stat()
{
int es=0;
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if (strcmp(token,"ID")) return(es=3); //不是标识符
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
while(strcmp(token,",")==0 )
{
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if (strcmp(token,"ID")) return(es=3); //不是标识符
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
};
if (strcmp(token,";") ) return(es=4);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
return(es);
}
//<程序>::={<声明序列><语句序列>}
//program::={<declaration_list><statement_list>}
int program()
{
int es=0;
fscanf(fp,"%s %s\n",token,token1);
printf("%s %s\n",token,token1);
if(strcmp(token,"main")==0)
{
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if (strcmp(token,"(")) return(es=5); //少左括号
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if (strcmp(token,")")) return(es=6); //少右括号
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
}
else
{
es=8;
return(es);
}
if(strcmp(token,"{"))//判断是否'{'
{
es=1;
return(es);
}
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=declaration_list();
if (es>0) return(es);
es=statement_list();
if (es>0) return(es);
if(strcmp(token,"}"))//判断是否'}'
{
es=2;
return(es);
}
return(es);
}
输入如下:
main()
{int a,b,c;
read a;
read b;
c=0;
do{
c=a*b;
b=b+1;
a=a-1;
}while(b<=20)
write c;
}
输出结果如下:
请输入源程序文件名(包括路径):main.txt
词法分析成功!
main main
( (
) )
{ {
int int
ID a
, ,
ID b
, ,
ID c
; ;
read read
ID a
; ;
read read
ID b
; ;
ID c
= =
NUM 0
; ;
do do
{ {
ID c
= =
ID a
* *
ID b
; ;
ID b
= =
ID b
+ +
NUM 1
; ;
ID a
= =
ID a
- -
NUM 1
; ;
} }
while while
( (
ID b
<= <=
ID b
<= <=
NUM 20
) )
write write
ID c
; ;
ID c
; ;
} }
=====语法分析结果!======
语法分析成功!
程序分析成功!!!

别忘了加分啊,呵呵本回答被提问者采纳
第2个回答  2009-06-19
代码真他妈难看
第3个回答  2009-06-20
looker_on

急(高悬赏 帮个忙) 求编译原理课程设计---c语言实现c-的语法分析,在线...
语法分析结果如下:(以四元式形式输出)( +, 6, 3, t1)( *, 7, t1, t2)( +, 1, t2, t3)( =, t3, __, a)( =, 1, __, b)\/\/提供一个编译原理的语义分析程序 你可以直接复制 用TC进行调试 include "stdio.h"include "string.h"include <malloc.h> include <conio.h> i...

(高分)编译原理的题,求高手,在线等,急急急!!!
算符优先文法——设有一不含ε产生式的算符文法G,如果对任意两个终结符对a,b之间至多只有 、 和 三种关系中的一种成立,则称G是一个算符优先文法。常用的中间语言种类有哪几种?答:有逆波兰式、三地址代码、抽象语法树和DAG。

编译原理课程设计-词法分析器设计(C语言)
include "stdio.h" \/*定义I\/O库所用的某些宏和变量*\/ include "string.h" \/*定义字符串库函数*\/ include "conio.h" \/*提供有关屏幕窗口操作函数*\/ include "ctype.h" \/*分类函数*\/ char prog[80]={'\\0'},token[8]; \/*存放构成单词符号的字符串*\/ char ch;int syn...

求C语言编译原理语法分析程序
"struct","switch","template","this","typedef","union","virtual","void","while"};\/\/关键字数组 char a[t],*p=c,*q=a,*s=a;bool w=0,r=0;int i=0;for(i=0;i<10;i++)a[i]=NULL;\/\/初始化临时数组 while (*p !=NULL){ q=s=a;if((*p>='a'&&*p<='z')||(*p...

编译原理课程设计
{ \/* FILENAME: C.Y *\/ } define YYDEBUG_LEXER_TEXT (yylval) \/* our lexer loads this up each time *\/ define YYDEBUG 1 \/* get the pretty debugging code to compile*\/ define YYSTYPE char * \/* interface with flex: should be in header file *\/ \/* Define terminal ...

一个编译原理的课程设计,急急急
回答:alkaid_pku 学长 4月14日 06:31 1. 预处理 2. 编译 3. 汇编 4. 查找库函数 5. 连接

编译程序有编译和翻译两种方式分别对其说明并比较 急 在线等
编译程序的实现算法较为复杂。这是因为它所翻译的语句与目标语言的指令不是一一对应关系,而是一多对应关系;同时也因为它要处理递归调用、动态存储分配、多种数据类型,以及语句间的紧密依赖关系。但是,由于高级程序设计语言书写的程序具有易读、易移植和表达能力强等特点,编译程序广泛地用于翻译规模较大、复杂性较高、且...

怎样去写一个编译器(用C语言写C语言编译器),需要哪些知识做铺垫,可以给...
写编译器重点就是设计并实现一些数据结构和算法,语言特点太多的话,代码写起来不容易,建议你找一个小语言尝试下,不要一开始就去尝试成熟语言。否则你会在写完语法分析程序以后,遭遇到很大的困难。多数人都是在写语义分析程序的时候,突然发现自己设计的数据结构很烂,后边越写越要命。如果你想入门编译...

编译原理
C语言编译器前端设计 编译过程一般是在计算机系统中实现的, 是将源代码转化为计算机通用语言的过程。编译器中包含入口点的地址、名称以及机器代码。编译器是计算机程序中应用比较多的工具, 在对编译器进行前端设计时, 一定要充分考虑影响因素, 还要对词法、语法、语义进行分析。[3]1 词法分析[3]词法分析...

C语言编译执行的全过程是怎样的?
用编译原理的话来说呢,分成词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成这么几个阶段。对c语言来说,一般只需要知道分成编译和连接两个阶段,编译阶段将源程序(*.c)转换成为目标代码(,一般是obj文件,至于具体过程就是上面说的那些阶段),连接阶段是把源程序转换成的目标代码...

相似回答