资源简介

词法分析主要是根据标识符的定义规则逐个识别字符或者字符串,包括对关键字、普通标识符、常数等的识别,分别构建标识符表和数字表,并生成二元式流。    语法分析和语义分析调用词法分析,然后查找用SLR(1)构造的ACTION表和GOTO表进行移进或归约,归约时根据不同的产生式进行不同的语义分析,最终输出分析过程,并形成符号表、二元式、四元式文件。    本次程序将本次课程所学的词法分析,语法分析和语义分析结合起来,使我们进一步理解正则表达式,自动机以及语法分析方法。同时加深掌握语法制导翻译和中间代码生成,在语法分析的同时进行语义加工并产生出中间代码的方法。

资源截图

代码片段和文件信息

#include“header.h“
#include
#include
#include

#define alen 100
#define blen 100
char ch;
FILE *in;  //源文件
FILE *outid;
FILE *outnum;  
letter wordbuf;
int equal;
int linenum=1;   //错误出现的行号
int error_count; //错误出现的个数
int id_count;
int num_count;

letter word[100];int w=0;
letter word1[100];
int addr=0;
int flag=0;
char get1[20];

char value[10];
char id_val[10];
char num_val[10];

char F_val[10];
char T_val[10];
char E_val[10];
char A_val[10];
char id1_val[10];


char *a1[alen]={“int““float““““;““id““#““S““D“};
char *a2[blen]={“id““=““;““+““*““(““)““num““#““A““E““T““F“};

/*int action1_table[10][8]=
{
34000012
    0000010000
    00650000
    00007000
    00008000
    00000-100
    00009000
    00-2-20000
    00-3-30000
    00-4-40000
};*/
/*int action2_table[17][13]=
{
2000000001000                    
000000001000000
0300000000000
8000070900456
001011000000000
00-3-3120-3000000
00-5-5-50-5000000
80000709001356
00-7-7-70-7000000
    00-8-8-80-8000000
00000000-10000
80000709000146
80000709000015
000110016000000
00-2-2120-2000000
00-4-4-40-4000000
00-6-6-60-6000000
};*/

int action1_table[10][8]=
{
3410210110110112
    10210210110110310000
    1041046510310400
    101101102102710400
    101101102102810400
    101101101101101-100
    101101102102910100
    104104-2-210310400
    104104-3-310310400
    104104-4-410310400
};
int action2_table[17][13]=
{
21011011011011011011011011000                    
1031011011011011031011031000000
10131011011011011011011010000
8101102102102710191010456
10310110111031031011031040000
103101-3-312103-31031010000
103101-5-5-5103-51031010000
81011011031037101910101356
103101-7-7-7103-71031040000
    103101-8-8-8103-81031040000
101101101101101101101101-10000
81011011021027101910100146
81011011021027101910100015
10310110111101103161031010000
103101-2-212103-21031010000
103101-4-4-4103-41031010000
103101-6-6-6103-61031010000
};


//初始化保留字表
void Scanner(Seqlist_key &keywordSeqlist_id &L1Number &L2)
{
strcpy(keyword.data[1].name“int“);     keyword.data[1].num=1; 
strcpy(keyword.data[2].name“char“);    keyword.data[2].num=2;
strcpy(keyword.data[3].name“float“);   keyword.data[3].num=3;
strcpy(keyword.data[4].name“void“);    keyword.data[

评论

共有 条评论