编译原理这门课期末有个课程设计,我们是让做一个模型语言的词法分析器的,这门课是我一年前学的,刚刚正好看到电脑里面有我当年做课程设计时的程序,在此我整理一下分享给大家,大家可以参考学习一下
参考程序:
#include<iostream>
#include <string>
using namespace std;
char prog[80], token[8], ch;
int syn, p, m, n, sum;
const char *rwtab[6] = { "begin","if","then","while","do","end" };
void scaner(void);
void P();
void L();
void V();
void V1();
void S();
void X();
string s;
int i;
int ERR;
int SwitchNum;
int main()
{
cout << endl;
p = 0;
printf("输入一个字符串(以'#'结束):\n");
do {
scanf_s("%c", &ch);
prog[p++] = ch;
} while (ch != '#');
cout << "词法分析结果:(词法信息,语义信息)" << endl;
p = 0;
do {
scaner();
switch (syn)
{
case 11:
printf("( %-10d%5d )\n", sum, syn);
break;
case -1:
printf("you have input a wrong string\n");
//getch();
return 0;
break;
default:
printf("( %-10s%5d )\n", token, syn);
break;
}
} while (syn != 0);
//getch();
do
{
s = "";
i = 0;
ERR = 0;
cout << "请输入一个句子(以#号结束):" << endl;
cin >> s;
s.resize(s.size() + 1);
s[s.size() - 1] = '#';
E();
if (s[i] == '#')
cout << "语法分析结果:success" << endl;
else
cout << endl;
cout << "输入一个整数继续,其它类型退出:";
} while (cin >> SwitchNum);
system("pause");
return 0;
}
void P()
{
if (ERR == 0)
{
if (s[i] == '{') {
++i;
L();
}
}
}
void L()
{
if (ERR == 0)
{
V();
if (s[i] == ';')
{
++i;
S();
}
else if (s[i] != '#')
{
cout << "语法分析结果:fail" << endl;
ERR = 1;
}
}
}
void V()
{
if (ERR == 0)
{
if(s[i]=='a'){
++i;
if (s[i] == 'i') {
++i;
V1();
}
}
}
void V1()
{
if (ERR == 0)
{
if (s[i] == ',')
{
++i;
if (s[i] == 'i') {
++i;
V1();
}
}
else if (s[i] != '#')
{
cout << "语法分析结果:fail" << endl;
ERR = 1;
}
}
}
void S()
{
if (ERR == 0)
{
if (s[i] == 'i')
{
++i;
if (s[i] == '=') {
++i;
X();
}
else if (s[i] == '#')
{
cout << "语法分析结果:fail" << endl;
ERR = 1;
++i;
}
}
}
}
void X()
{
if (ERR == 0) {
if (s[i] = 'i') {
++i;
}
else
{
cout << "语法分析结果:fail" << endl;
}
if (s[i]='x')
{
++i;
}
else
{
cout << "语法分析结果:fail" << endl;
}
}
}
void scaner(void)
{
sum = 0;
for (m = 0; m < 8; m++)
token[m++] = NULL;
ch = prog[p++];
m = 0;
while ((ch == ' ') || (ch == '\n'))
ch = prog[p++];
if (((ch <= 'z') && (ch >= 'a')) || ((ch <= 'Z') && (ch >= 'A')))
{
while (((ch <= 'z') && (ch >= 'a')) || ((ch <= 'Z') && (ch >= 'A')) || ((ch >= '0') && (ch <= '9')))
{
token[m++] = ch;
ch = prog[p++];
}
p--;
syn = 10;
for (n = 0; n < 6; n++)
if (strcmp(token, rwtab[n]) == 0)
{
syn = n + 1;
break;
}
}
else if ((ch >= '0') && (ch <= '9'))
{
while ((ch >= '0') && (ch <= '9'))
{
sum = sum * 10 + ch - '0';
ch = prog[p++];
}
p--;
syn = 11;
}
else
{
switch (ch)
{
case '<':
token[m++] = ch;
ch = prog[p++];
if (ch == '=')
{
syn = 22;
token[m++] = ch;
}
else
{
syn = 20;
p--;
}
break;
case '>':
token[m++] = ch;
ch = prog[p++];
if (ch == '=')
{
syn = 24;
token[m++] = ch;
}
else
{
syn = 23;
p--;
}
break;
case '+':
token[m++] = ch;
ch = prog[p++];
if (ch == '+')
{
syn = 17;
token[m++] = ch;
}
else
{
syn = 13;
p--;
}
break;
case '-':
token[m++] = ch;
ch = prog[p++];
if (ch == '-')
{
syn = 29;
token[m++] = ch;
}
else
{
syn = 14;
p--;
}
break;
case '!':
ch = prog[p++];
if (ch == '=')
{
syn = 21;
token[m++] = ch;
}
else
{
syn = 31;
p--;
}
break;
case '=':
token[m++] = ch;
ch = prog[p++];
if (ch == '=')
{
syn = 25;
token[m++] = ch;
}
else
{
syn = 18;
p--;
}
break;
case '*':
syn = 15;
token[m++] = ch;
break;
case '/':
syn = 16;
token[m++] = ch;
break;
case '(':
syn = 27;
token[m++] = ch;
break;
case ')':
syn = 28;
token[m++] = ch;
break;
case '{':
syn = 5;
token[m++] = ch;
break;
case '}':
syn = 6;
token[m++] = ch;
break;
case ';':
syn = 26;
token[m++] = ch;
break;
case '\"':
syn = 30;
token[m++] = ch;
break;
case '#':
syn = 0;
token[m++] = ch;
break;
case ':':
syn = 17;
token[m++] = ch;
break;
default:
syn = -1;
break;
}
}
token[m++] = '\0';
}
调试与运行:
当时我呢也不是很有思路做这个,也是参考了一些别人写的程序,有不对的地方欢迎各位小伙伴来指正哈!!!
觉得不错三连支持一下哦!