#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;
}