文档介绍:词法分析实习报告
实习题目
设计一个表达式的文法
①表达式中的运算按运算符优先级由高到低依次有:
+、-、*、/、↑
其中+、-是左结合,*、/、↑右结合。
②表达式中的运算对象可以为标识符、无正负号常量。
设计的文法
G[<表达式>]=(VN,VT,P,<表达式>)其中,
VN={<表达式>,<无正负号常量>,<标志符>,<数字>,<字母>}
VT={ a…z,A…Z,0…9}
P={<表达式>→DE↑<表达式>∣DE;DE→ME/DE∣ME;ME→SE*ME∣SE;SE→SE-AE∣AE;AE→AE+<表达式>∣<表达式>∣<标识符>∣<无正负号常量>;〈标识符〉→〈字母〉|〈标识符〉〈字母〉|〈标识符〉〈数字〉;〈无正负号常量〉→〈数字〉|〈无正负号常量〉〈数字〉;〈字母〉→ a|b|…|x|y|z|A|B|…|X|Y|Z;〈数字〉→ 1│2│3│4│5│6│7│8│9│0}
词法分析程序设计思路
,根据设计的文法可以判断出表达式中的单词种类有标识符,运算符,常量。
非字母或数字
2
字母或数字
字母
1
0
数字
非数字
数字
3
4
+
5
-
6
*
7
/
8
|
9
其它
10
识别各类单词符号的状态转换图
所用数据结构
FILE *fp;//用于存放原表达式文件
FILE *outp;//用于存放单词输出结果
char ch;//用于存储当前读取的字符
char *operatornum[5]={"+","-","*","/","|"};//用于存放运算符
源码
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
#include <>
FILE *fp;//用于存放原表达式文件
FILE *outp;//用于存放单词输出结果
char ch;//用于存储当前读取的字符
char *operatornum[5]={"+","-","*","/","|"};//用于存放运算符
//////////////////////////////////////////////////////////////////////////////////////////
bool search(char searchstr[])//匹配运算符
{
int i;
for(i=0;i<=4;i++)
if(strcmp(operatornum[i],searchstr)==0)
return(true);
return(false);
}
///////////////////////////////////////////////////////////////////////////////////////////
char letterprocess (char ch)//字母处理函数
{
int i=-1;