• 大小: 34KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-09-05
  • 语言: 其他
  • 标签:

资源简介

能读取词法分析结果进行语法分析,在语法分析的同时进行语义分析,生成中间代码;采用LR分析法的实现

资源截图

代码片段和文件信息

#include “string.h“
#include “stdio.h“
#include “stdlib.h“
#include “malloc.h“
#include “cifafenxi.h“

char state[20]={0} ; //状态栈
char yuyi[10] = ““; //语义栈
char fuhao[30] = “$“; //符号栈
char input[80] = ““; //输入符号栈

int nextq=0; //四元式生成变量之序号
char si_n[10]; //四元式之数字部分
char si_s[10][5]; //四元式之操作符部分
char si3[10]; //第三部分
char si4[10]; //第四部分
//0--->9 文法
const char wf1[10][5]={“S““E““E““T““T““F““F““F““F““F“};
const char wf2[10][11]={“E““EorT““T““TandF““F““notF““(E)““AropA““iropi““i“};
const int wf3[10]={1313123331}; //各条需回退几步
const int wf4[10]={09911111010101010}; //各条在表中对应的坐标

//LR分析表
const char lr_f[19][8]={ 
000‘S‘0‘S‘0‘S‘
‘a‘0‘S‘00000
‘r‘‘S‘‘r‘000‘r‘0
‘r‘‘r‘‘r‘000‘r‘0
000‘S‘0‘S‘0‘S‘
000‘S‘0‘S‘0‘S‘
0000‘S‘000
00000000
‘r‘‘r‘‘r‘000‘r‘0
‘r‘‘r‘‘r‘0‘S‘0‘r‘0
0000000‘S‘
‘r‘‘r‘‘r‘000‘r‘0
000‘S‘0‘S‘0‘S‘
000‘S‘0‘S‘0‘S‘
‘r‘‘r‘‘r‘000‘r‘0
00‘S‘000‘S‘0
‘r‘‘r‘‘r‘000‘r‘0
‘r‘‘r‘‘r‘000‘r‘0
‘r‘‘S‘‘r‘000‘r‘0} ; //主要动作第一部分(‘S‘ or ‘r‘ or ‘a‘(acc))

const int lr_s[19][12]={
000405096132
0012000000000
2132000200000
444000400000
0004050960140
0004050961532
000070000000
000000008000
777000700000
9990100900000
0000000110000
888000800000
0004050960318
0004050960170
555000500000
00120001600000
666000600000
333000300000
1121000100000} ; //主要部分第二部分(数字)
/*定义必须在程序之前!!!!*/
int pi=0ps=0py=0pf=0;

void main()
{
int t1=0t2=0; //临时变量
char ts[10]={0}; //临时字符串变量
int bz=1; //步骤
int flag=1; //是否读取下一个字符:1读取,0不读取

/*输入待分析字符串*/
    p=0;
    printf(“\n Please input string with the end of ‘$‘:\n“);
    do
    {
     ch=getchar();
     prog[p]=ch;
     p++;
    }while(ch!=‘$‘);
t1=0;

    p=0;
/*pi输入符号栈指针,ps状态,py语义,pf符号*/

strcpy(inputprog); //拷贝一份到input[]中以用作处理

printf(“步骤 状态栈            语义栈    符号栈             输入符号栈       主要动作  \n“);
scaner();
while(1)
{

printf(“%-4d“bz++);

t1=0t2=0;
do{
printf(“%d|“state[t1]);
if(state[t1++]>=10)
t2+=3; //t2为状态栈显示所占位置的大小
else
t2+=2;
}while(state[t1]!=0);


for(t1=0;t1<20-t2;t1++) //不足则补空格,保证状态栈总为20大小,方便对齐
printf(“ “);


for(t1=1;t1<=py;t1++) //打印语义栈
printf(“_%d“yuyi[t1]);

for(t1=0;t1<8-py*2;t1++)
printf(“ “);

printf(“ %-13s\t%-13s\t%c%d\n“fuhaoinputlr_f[state[ps]][syn]lr_s[state[ps]][syn]);
//syn是

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3229  2008-01-19 16:56  编译原理\cifafenxi.h

     文件       5291  2008-01-19 11:28  编译原理\main.c

     文件     184406  2008-01-19 16:56  编译原理\main.exe

     目录          0  2010-05-06 11:26  编译原理

----------- ---------  ---------- -----  ----

               192926                    4


评论

共有 条评论