实验1 词法分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验1 词法分析
一、实验目的
通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。
二、实验要求
(1)掌握词法分析的实现方法。
(2)上机调试编出的词法分析程序。
(3)源程序可以从键盘输入也可以事先存在文件中
(4)将源程序中的各个单词读出后可以显示在屏幕中也可以存在文件中(包括单词的类别)
三、实验题目
用 C/C++ 语言编写以下 C/C++ 子集的词法分析程序。
四、实验代码
/*测试数据
BEGIN
VAR A+,2A,A3,A4:INTEGER;
A1:=1,A2:=123,A3:=123-12;
WHILE A2=A3 DO A4:=234A*123/45+A1
iF A1>A2
THEN A1:=A4;
ELSE
A4:=(A1+A2)*A!;
END
*/
#include
#include
#include
using namespace std;
int letter(char c)//字母
{
if(c>='A' && c<='Z')return 1;
else return 0;
}
int digit(char c)//数字
{
if(c>='0' && c<='9')return 1;
else return 0;
}
int oper(char c)//运算符
{
if(c=='+' || c=='-' || c=='*' || c=='/')return 1;
else return 0;
}
int relation(char c)//关系运算符
{
if(c=='<'||c=='>'||c=='=')return 1;
else return 0;
}
int jiefu(char c)//界符
{
if(c==',' || c==':' || c==';'|| c=='.'|| c=='('|| c==')')return 1;
else return 0;
}
int border(char c)//单词边界
{
if(c==',' || c==':' || c==';'|| c==' '|| c=='.' || c=='('|| c==')'|| c=='+' || c=='-' || c=='*' || c=='/' || c=='<' || c=='>'|| c=='=' ) return 1;
else return 0;
}
int illegal(char *s)//找非法字符
{
int i,l=strlen(s);
for(i=0;i { if(!letter(s[i]) && !digit(s[i])) return 1; } return 0; } int identifier(char *s)//标识符 { if(illegal(s))return 0; if( letter(s[0]) ) return 1; else return 0; } int unsigned_word(char *s)//无符号数 { int i,len=strlen(s); for(i=0;i if(!digit(s[i]))return 0; return 1; } int r_word(char *s)//保留字 { if(illegal(s))return 0; else if(!strcmp(s,"INTEGER")) return 1; else if(!strcmp(s,"WHILE")) return 1; else if(!strcmp(s,"BEGIN")) return 1; else if(!strcmp(s,"ELSE")) return 1; else if(!strcmp(s,"VAR")) return 1; else if(!strcmp(s,"END")) return 1; else if(!strcmp(s,"IF")) return 1; else if(!strcmp(s,"DO")) return 1; else if(!strcmp(s,"THEN")) return 1; else return 0; } void judge_word(char *s)//判断单词 { int len=strlen(s); if(len==0)return ; if(r_word(s))cout<<"保留字: "< else if(identifier(s))cout<<"标识符: "< else if(unsigned_word(s))cout<<"无符号数: "< else cout<<"非法单词: "< } void main() { char s[100],word[100]; while(gets(s)) { int i,j=0,len=strlen(s); for(i=0;i { if(border(s[i])) { word[j]='\0';j=0; judge_word(word); if(s[i]==':' && s[i+1]=='=') { cout<<"赋值符:"< i++; word[0]='\0'; continue; } else if(s[i]=='>' && s[i+1]=='=' || s[i]=='<' && s[i+1]=='=' || s[i]=='<' && s[i+1]=='>')