- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C词法分析
用c++实现词法分析器文法如下:
〈赋值语句〉→〈标识符〉:=〈无符号数〉
〈标识符〉→〈字母〉|〈字母〉〈数字〉
〈无符号数〉→〈数字〉|〈数字〉.〈数字〉
〈字母〉→ A│B│C│D│E│F│G│H│I│J│K│L│M│N│O│P│Q│R│S│T│
│U│V│W│X│Y│Z
〈数字〉→ 1│2│3│4│5│6│7│8│9│0
输入: Abc123:=3.14
输出: 正确
标识符:Abc123
赋值符::=
无符号数:3.14
输入: 123:=3.14
输出: 错误
标识符错误
实验二:自上而下语法分析
1. 实验项目的目的和任务
通过实验,使学生掌握递归下降分析程序的实现及语法分析方法。要求学生选择一种熟悉的高级语言,编写递归下降预测分析程序。
2. 上机实验内容
使用C或C++语言实现如下赋值语句的语法分析:
ABC123:=3.14+34.45;
文法如下:
ASS→ ID := DATA + DATA;
ID → LETTER DIGITAL | ID
DATA → DIGITAL | DIGITAL DATA
LETTER→ A│B│C│D│E│F│G│H│I│J│K│L│M│N│O│P│Q│R│S│T│
│U│V│W│X│Y│Z
DIGITAL→ 1│2│3│4│5│6│7│8│9│0
实验测试数据:
输入: ABC123:=3.14+34.45;
输出: 合法
输入: ABC123=3.14;
输出: 错误
“:”错误
#include stdio.h
#include stdlib.h
#include string.h
#include ctype.h
#define START -1//定义数组下表从0开始
#define MAXSIZE 20//PL/0 最大的字符串,保留字等
FILE *fp;//pascal源程序文件
FILE *fp1 = fopen(PL词法分析结果.txt,w);//把词法分析结果写到文件 PL分析结果.txt中
char *keyWord[] = { const,do,begin,end,call,if,else,then,procedure,read,write,var,while,odd};//pascal基本字
char *Operators[] = {+,-,*,/};//pascal运算符
char *compareOperators[] = {,=,=,,=,};//pascal比较符
char *endOperators[] = { , , : , ; , := , . , ( , ) , };//pascal界符
/////////////////////////////////////////////////////////////////////////////////////////
//函数名:Compare
//参数:char SearchStr[],int type
//功能: 分析源程序中处理过后的字符串,按照基本字,运算符,比较符,界符进行分析
//返回值: true / false
bool Compare(char SearchStr[],int type)
{
switch (type) // 字符串类型
{
case 1:{//pascal基本字
for(int i = 0;i = 13;i++)
{
if (strcmp(keyWord[i],SearchStr) == 0)//字符串在keyWord中
return true;
}
break;
}
case 2:{//pascal运算符
for(int i = 0;i = 3;i++)
{
if(strcmp(Operators[i],SearchStr) == 0)//字符串在Operators中
return true;
}
break;
}
case 3: {//pascal比较符
for(int i = 0;i = 5;i++)
{
if(strcmp(compareOperators[i],SearchStr)==0)//字符串在compareOperators中
return true;
}
break;
}
case 4: {//pascal界符
for( int i = 0;i = 7;i++)
{
if(strcmp(endOperators[i],S
文档评论(0)