#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<string>
using namespace std;
char character;
char token[20] = { 0 };
char buff[2000];
int nowLoc=-1;
char symbol_table[100][20] = { 0 };
char constant_table[100][20] = { 0 };
char reserved_words[15][20] = {
"",
"begin",
"end",
"integer",
"if",
"then",
"else",
"function",
"read",
"write"
};
char get_char() {
nowLoc++;
character = buff[nowLoc];
return character;
}
void getnbc()
{
if (character == ' ')
get_char();
}
void concat() {
int i = 0;
while (token[i] != '\0') {
i++;
}
token[i] = character;
token[i + 1] = '\0';
}
bool letter() {
if (character>= 'a'&&character <= 'z' || character >= 'A'&&character <= 'Z')
return true;
else
return false;
}
bool digit() {
if (character >= '0'&&character <= '9')
return true;
else
return false;
}
// token 最后一个字母
void retract() {
nowLoc--;
character = ' ';
}
int reserve() {
for (int i = 1; i < 11; i++) {
if (strcmp(token, reserved_words[i]) == 0)
return i;
}
return 0;
}
int symbol() {
int i = 0;
while (strcmp(symbol_table[i], "") != 0) {
if (strcmp(symbol_table[i], token) == 0)
return i;
else
i++;
}
strcpy_s(symbol_table[i], token);
return i;
}
void return_tuple(char* s,int x) {
for (int i = 0; i < 16 - strlen(s); i++)
cout << " ";
cout << s << " ";
if (x < 10)
cout << " " << x << endl;
else
cout << x << endl;
}
void error() {
}
void Lex() {
char str_num[20] = { 0 };
memset(token, 0, 20);
/*get_char();*/
getnbc();
int num, val;
//num保留字位置, val变量表位置
switch (character) {
case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':case 'g':case 'h':case 'i':
case 'j':case 'k':case 'l':case 'm':case 'n':case 'o':case 'p':case 'q':case 'r':
case 's':case 't':case 'u':case 'v':case 'w':case 'x':case 'y':case 'z':
case 'A':case 'B':case 'C':case 'D':case 'E':case 'F':case 'G':case 'H':case 'I':
case 'J':case 'K':case 'L':case 'M':case 'N':case 'O':case 'P':case 'Q':case 'R':
case 'S':case 'T':case 'U':case 'V':case 'W':case 'X':case 'Y':case 'Z':
while (letter() || digit()) {
concat();
get_char();
}
retract();
num = reserve();
if (num != 0)
return_tuple(reserved_words[num], num);
else {
val = symbol();
return_tuple(symbol_table[val], val);
}
break;
case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':
while (digit()) {
concat();
get_char();
}
strcmp(str_num, token);
retract();
return_tuple(str_num, 11);
break;
case '<':
get_char();
if (character == '=')
return_tuple("<=", 14);
else if (character == '>')
return_tuple("<>", 13);
else {
retract();
return_tuple("<", 15);
}
break;
case '>':
get_char();
if (character == '=')
return_tuple(">=", 16);
else {
retract();
return_tuple(">", 17);
}
break;
case ':':
get_char();
if (character == '=')
return_tuple(":=", 20);
else {
retract();
//出错处理
}
break;
case '-':
return_tuple("-", 18);
break;
case '*':
return_tuple("*", 19);
break;
case '(':
return_tuple("(", 21);
break;
case ')':
return_tuple(")", 22);
break;
case ';':
return_tuple(";", 23);
break;
default:
error();
//
}
}
int main() {
cout << "代码:"<<endl;
char c;
string buff_ex;
FILE *fp;
char* file_name = "D:\\develop\\cifa\\nplus.pas";
puts(file_name);
fp = fopen(file_name, "r"); //打开文件
char ch;
int i = 0;
while ((ch = fgetc(fp)) != EOF) {
buff[i] = ch;
i++;
putchar(ch);
}
//输出一个字符
fclose(fp); //关闭文件指针
/*puts(buff);*/
while (get_char() != '\0') {
Lex();
}
system("pause");
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
cifa.zip_5M7_编译原理实验
共34个文件
tlog:12个
pdb:4个
lastbuildstate:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 34 浏览量
2022-09-21
00:24:19
上传
评论
收藏 3.81MB ZIP 举报
温馨提示
电子科大编译原理实验,实验n的阶乘的词法翻译
资源推荐
资源详情
资源评论
收起资源包目录
cifa.zip (34个子文件)
tf_book
cifa.VC.db 7.96MB
nplus.pas 176B
x64
Debug
cifa.ilk 1.23MB
cifa.pdb 1.74MB
cifa.exe 97KB
cifa.sln 1KB
cifa
x64
Debug
vc140.pdb 404KB
main.obj 159KB
vc140.idb 339KB
cifa.tlog
cifa.lastbuildstate 180B
CL.write.1.tlog 316B
CL.read.1.tlog 15KB
CL.command.1.tlog 458B
link.write.1.tlog 302B
link.command.1.tlog 982B
link.read.1.tlog 3KB
cifa.log 223B
main.cpp 4KB
Debug
vc140.pdb 348KB
main.obj 60KB
vc140.idb 323KB
cifa.tlog
cifa.lastbuildstate 182B
CL.write.1.tlog 292B
CL.read.1.tlog 15KB
CL.command.1.tlog 472B
link.write.1.tlog 270B
link.command.1.tlog 942B
link.read.1.tlog 3KB
cifa.log 129B
cifa.vcxproj 6KB
cifa.vcxproj.filters 945B
Debug
cifa.ilk 386KB
cifa.pdb 812KB
cifa.exe 48KB
共 34 条
- 1
资源评论
朱moyimi
- 粉丝: 64
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功