#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char ichar[100], token[8];
char ch;
int syn, p, m = 0, n, row, sum = 0;
char *KeyWord[9] = { "begin","if","then","while","do","end" ,"else","break","for"};
void Scaner()
{
for (n = 0;n<8;n++) token[n] = NULL;
ch = ichar[p++]; //输入的字符
//过滤空格
while (ch == ' ')
{
ch = ichar[p];
p++;
}
//字符为标识符或变量名
if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z'))
{
m = 0;
while ((ch >= '0'&&ch <= '9') || (ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z'))
{
token[m++] = ch;
ch = ichar[p++];
}
token[m++] = '\0';
p--;
syn = 10;//字符种别码为10
//判断识别出来的字符是否为已定义6个标示符
for (n = 0;n < 9;n++)
{
if (strcmp(token, KeyWord[n]) == 0)
{
syn = n + 1;
break;
}
}
}
//字符为数字
else if ((ch >= '0'&&ch <= '9'))
{
{
sum = 0;
while ((ch >= '0'&&ch <= '9'))
{
sum = sum * 10 + ch - '0';
ch = ichar[p++];
}
}
p--;
syn = 11;
if (sum>32767) //超出16位整数的表示范围 2^15=32768,ERROR
syn = -1;
}
//其他字符
else switch (ch)
{
case'<':m = 0;token[m++] = ch;
ch = ichar[p++];
if (ch == '>') //符号<>
{
syn = 21;
token[m++] = ch;
}
else if (ch == '=') //符号<=
{
syn = 22;
token[m++] = ch;
}
else //符号<
{
syn = 23;
p--;
}
break;
case'>':m = 0;token[m++] = ch;
ch = ichar[p++];
if (ch == '=') //符号>=
{
syn = 24;
token[m++] = ch;
}
else //符号>
{
syn = 20;
p--;
}
break;
case':':m = 0;token[m++] = ch;
ch = ichar[p++];
if (ch == '=') //符号:=
{
syn = 18;
token[m++] = ch;
}
else //符号:
{
syn = 17;
p--;
}
break;
case'*':syn = 13;token[0] = ch;break;
case'/':syn = 14;token[0] = ch;break;
case'+':syn = 15;token[0] = ch;break;
case'-':syn = 16;token[0] = ch;break;
case'=':syn = 25;token[0] = ch;break;
case';':syn = 26;token[0] = ch;break;
case'(':syn = 27;token[0] = ch;break;
case')':syn = 28;token[0] = ch;break;
case'#':syn = 0;token[0] = ch;break;
case'\n':syn = -2;break;
default: syn = -1;break;
}
}
void main()
{
p = 0;
row = 1;
cout << "请输入字符串,以“#”结束:" << endl;
do
{
cin.get(ch);
ichar[p++] = ch;
}
while (ch != '#');
p = 0;
do
{
Scaner();
switch (syn)
{
case 11: cout << "(" << syn << "," << sum << ")" << endl; break;
case -1: cout << "Error in row " << row << "!" << endl; break;
case -2: row = row++;break;
default: cout << "(" << syn << "," << token << ")" << endl; break;
}
} while (syn != 0);
system("pause");
}
没有合适的资源?快使用搜索试试~ 我知道了~
Jingyu.zip_http://www.jingyu_词法分析
共33个文件
tlog:12个
pdb:4个
exe:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 100 浏览量
2022-09-21
00:08:10
上传
评论
收藏 784KB ZIP 举报
温馨提示
词法分析程序是独立的一遍,把字符流的源程序变为单词序列,输出到一个中间文件,这个文件作为语法分析程序的输入而继续编译过程。该词法分析程序的功能是输入源程序,按照构词规则分解成一系列的单词符号,包括关键字、标识符、运算符、界符和常量等。
资源推荐
资源详情
资源评论
收起资源包目录
Jingyu.zip (33个子文件)
Jingyu
.vs
LexicalAnalysis
v14
.suo 28KB
LexicalAnalysis.sln 1KB
x64
Debug
LexicalAnalysis.pdb 852KB
LexicalAnalysis.exe 67KB
LexicalAnalysis.ilk 417KB
LexicalAnalysis
Դ.cpp 3KB
LexicalAnalysis.vcxproj.filters 944B
x64
Debug
Դ.obj 63KB
vc140.pdb 348KB
LexicalAnalysis.tlog
CL.write.1.tlog 512B
CL.read.1.tlog 15KB
CL.command.1.tlog 622B
LexicalAnalysis.lastbuildstate 207B
link.write.1.tlog 504B
link.command.1.tlog 1KB
link.read.1.tlog 3KB
vc140.idb 323KB
LexicalAnalysis.log 231B
Debug
Դ.obj 56KB
vc140.pdb 348KB
LexicalAnalysis.tlog
CL.write.1.tlog 560B
CL.read.1.tlog 15KB
CL.command.1.tlog 690B
LexicalAnalysis.lastbuildstate 218B
link.write.1.tlog 544B
link.command.1.tlog 1KB
link.read.1.tlog 3KB
vc140.idb 323KB
LexicalAnalysis.log 241B
LexicalAnalysis.vcxproj 7KB
Debug
LexicalAnalysis.pdb 868KB
LexicalAnalysis.exe 49KB
LexicalAnalysis.ilk 361KB
共 33 条
- 1
资源评论
钱亚锋
- 粉丝: 86
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功