当前位置:
文档之家› 编译原理词法分析和语法分析报告 代码(C语言版)[1]
编译原理词法分析和语法分析报告 代码(C语言版)[1]
char ch='\0';
/*从字符缓冲区读取当前字符*/
int count=0;
/*词法分析结果缓冲区计数器*/
static char spelling[10]={""}; /*存放识别的字*/
static char line[81]={""}; /*一行字符缓冲区,最多 80 个字符*/
char *pline;
scaner(); main() {p=0;
printf("\n please input a string(end with '#'):/n"); do{
scanf("%c",&ch); prog[p++]=ch; }while(ch!='#'); p=0; do{ scaner(); switch(syn)
EO
19
B or(即布尔表达式中的 B∨ )
Plus
34
“+”
Times
36
Becomes
38
Op_and
39
Op_or
40
Op_not
41
Rop
42
Lparent
48
Rparent
49
Ident
56
Intconst
57
#define sy_if
0
#define sy_then 1
#define sy_else 2
case '*': syn=15; token[m++]=ch; break;
case '/': syn=16; token[m++]=ch; break;
case '(': syn=27; token[m++]=ch; break;
case ')': syn=28; token[m++]=ch; break;
break; } }while(syn!=0); getch(); }
scaner() { sum=0;
for(m=0;m<8;m++)token[m++]=NULL; ch=prog[p++]; m=0; while((ch==' ')||(ch=='\n'))ch=prog[p++]; if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
西南交通大学 编译原理课程设计报告
系(院):
信息科学与技术学院
专 业:
软件工程
班 级:
软件二班
姓 名: 吴任杰 学 号: 20103132
指导教师:
丁光耀
2012 年 12 月 14 日
词法分析
一、实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
二、实验要求
2.1 待分析的简单的词法
case '!':ch=prog[p++]; if(ch=='=') { syn=21; token[m++]=ch; } else
{ syn=31; p--;
} break;
case '=':token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=25; token[m++]=ch; } else { syn=18; p--; } break;
#define rparent 49
#define ident
56
#define intconst 57
/*E and*/ /E or*/
“*” “ := ” 赋值 “ and ” “ or ” “ not ” 关系运算符
“(” “)” 变量
整常量
1.2 变量及数据结构说明
编译程序中涉及到的变量及数据结构说明如下:
1.1 单词符号的内部定义及在编译程序中的定义
我们对常量、变量、临时变量、保留关键字(if、while、begin、end、else、
then、do 等)、关系运算符、逻辑运算符、分号、括号等,规定其内部定义如下:
符号
种别编码
说
明
sy_if
0
保留字 if
sy_then
1
保留字 then
sy_else
p--; } break; case '+': token[m++]=ch; ch=prog[p++]; if(ch=='+') { syn=17;
token[m++]=ch; } else { syn=13;
p--; } break;
case '-':token[m++]=ch; ch=prog[p++]; if(ch=='-') { syn=29; token[m++]=ch; } else { syn=14; p--; } break;
#define sy_while 3
#define sy_begin 4
#define sy_do
5
#define sy_end 6
#define a
7
#define semicolon 8
#define e
9
#define jinghao 10
#define S
11
#define L
12
#define tempsy 15
case '#': syn=0; token[m++]=ch; break;
case ':':syn=17;
token[m++]=ch; break; default: syn=-1; break; } token[m++]='\0'; }
五、结果分析:
输入 begin x:=7;end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(end 10)(# 0) 如图 5-1 所示:
ch=prog[p++]; if(ch=='=') { syn=22; token[m++]=ch; }
else { syn=20;
p--; } break; case '>':token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24;
token[m++]=ch; } else { syn=23;
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想
是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图: 主程序示意图如图 3-1 所示。其中初始包括以下两个方面:
⑴ 关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程 序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标 识符。关键字表为一个字符串数组,其描述如下:
/*字符缓冲区指针*/
static char ntab1[100][10]; /*变量名表,共 100 项,每项长度 10*/
case '{': syn=5; token[m++]=ch; break;
case '}': syn=6; token[m++]=ch; break;
case ';': syn=26; token[m++]=ch; break;
case '\"': syn=30; token[m++]=ch; break;
(1) 词法分析部分 (2) 语法分析、语义分析及四元式生成部分 (3) 输出显示部分
1.词法分析器设计
词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号 格式为如下的二元式:
(单词种别编码,单词自身的值) 由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输 入错误的检查。
2
保留字 else
sy_while
3
保留字 while
sy_begin
4
保留字 begin
sy_do
5
保留字 do
sy_end
6
保留字 end
a
7
赋值语句
semicolon
8
“;”
e
9
布尔表达式
Jinghao
10
“#”
S
11
语句
L
12
复合语句
Tempsy
15
临时变量
EA
18
B and(即布尔表达式中的 B∧)
4
<>
21
do
5
<=
22
end
6
>
23
lettet(letter|digit)*