#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char string[50];//命令行读入的字符串
char get[10];//分析出来的关键字和标识符
int num;//种别码
int p;//当前词法分析正在进行的位置
char *keywords[6] = { "begin","if","then","while","do","end" };
//关键字数组
int n[20];//经词法分析得到的种别码的数组,语法分析时使用
int k;//词法分析的单词的总个数
int q=0;//当前语法分析正在进行的位置
//以下是语法分析的非终结符
bool S();
bool A();
bool B();
bool C();
bool D();
bool E();
bool F();
bool F1();
bool G();
bool G1();
void words(char ch) {
int m = 0;
int n;
while (((ch <= 'z') && (ch >= 'a')) || ((ch <= 'Z') && (ch >= 'A')) || ((ch >= '0') && (ch <= '9')))
{
get[m++] = ch;
ch = string[p++];
}
p--;
num = 10;
for (n = 0; n<6; n++)
if (strcmp(get, keywords[n]) == 0)
{
num = n + 1;
break;
}
get[m++] = '\0';
}
int number(char ch) {
int sum = 0;
while ((ch >= '0') && (ch <= '9'))
{
sum = sum * 10 + ch - '0';
ch = string[p++];
}
p--;
num = 11;
return sum;
}
void symbol(char ch) {
int m = 0;
switch (ch)
{
case '+':num = 13;
get[m++] = ch;
break;
case '-':num = 14;
get[m++] = ch;
break;
case '*': num = 15;
get[m++] = ch;
break;
case '/': num = 16;
get[m++] = ch;
break;
case ':': get[m++] = ch;
ch = string[p++];
if (ch == '=')
{
num = 18;
get[m++] = ch;
}
else
{
num = 17;
p--;
}
break;
case '<':get[m++] = ch;
ch = string[p++];
if (ch == '=')
{
num = 22;
get[m++] = ch;
}
else if (ch == '>')
{
num = 21;
get[m++] = ch;
}
else
{
num = 20;
p--;
}
break;
case '>':get[m++] = ch;
ch = string[p++];
if (ch == '=')
{
num = 24;
get[m++] = ch;
}
else
{
num = 23;
p--;
}
break;
case '=': num = 25;get[m++] = ch;break;
case ';': num = 26;get[m++] = ch;break;
case '(': num = 27;get[m++] = ch;break;
case ')': num = 28;get[m++] = ch;break;
case '#': num = 0;get[m++] = ch;break;
default: num = -1;break;
}
get[m++] = '\0';
}
//语法分析 递归下降法**************************************************
void lrparser()
{
if (S()) printf("Success!\n");
else printf("Error!\n");
}
bool S() {
if(n[k-1]!=6 && n[k - 2] != 26) { printf("error: 缺少 end\n");return false; }
else if (n[k - 2] == 26) {
printf("error: 缺少被赋值变量\n");
return false;
}
if (n[q] == 1) q++;
else
{
printf("error: 缺少 begin\n");return false;
}
if (!A()) return false;
if (n[q] == 6)return true;
}
bool A() {
if (!B()) return false;
if (!C()) return false;
return true;
}
bool B() {
if (n[q] == 10) q++;
else return false;
if (n[q] == 18) q++;
else { printf("error: 缺少等号\n"); return false; }
if (!E()) return false;
return true;
}
bool C() {
if (n[q] == 6) return true;
if (n[q] == 26) q++;
else { printf("error: 缺少 end \n"); return false; }
if (!B()) return false;
if (!D()) return false;
return true;
}
bool D() {
if (n[q] == 26 && C()) return true;
if (n[q] == 6) return true;
else { return false; printf("error: 缺少 end\n");}
return false;
}
bool E() {
if (!F()) return false;
if (!F1()) return false;
return true;
}
bool F1(){
if (n[q] == 26||n[q] == 6) return true;
else if (n[q] == 13 || n[q] == 14) q++;
if (!F()) return false;
return true;
}
bool F() {
if (!G()) return false;
if (!G1()) return false;
return true;
}
bool G1() {
if (n[q] == 13 || n[q] == 14 || n[q] == 6 || n[q] == 26) return true;
if (n[q] == 15 || n[q] == 16) q++;
if (!G()) return false;
return true;
}
bool G() {
if (n[q] == 10) { q++; return true; }
if (n[q] == 11) { q++; return true; }
if (n[q] == 27) {
q++;
if (!E()) return false;
else if(n[q]==28) { return true; q++; }
}
}
//*******************************************************
void main()
{
int i = 0;
printf("请输入字符串,以#结束:\n\n");
char ch;
do {
scanf("%c", &ch);
string[i++] = ch;
} while (ch != '#');
p = 0;
int sum, m;//数字的求和
//printf("\n词法分析二元组输出:\n");
do {
memset(get, 0, sizeof(get));//清空get字符串
ch = string[p++];
m = 0;
while ((ch == ' ') || (ch == '\n')) //对于代码中的空格和回车的处理
ch = string[p++];
if (((ch <= 'z') && (ch >= 'a')) || ((ch <= 'Z') && (ch >= 'A'))) words(ch);//对于代码中关键字和标识符的处理
else if ((ch >= '0') && (ch <= '9')) sum = number(ch);//对于代码中的数字的处理
else symbol(ch);//对于代码中的符号的处理
n[q] = num;
q++;
/*switch (num)
{
case 11:printf("( %-5d%5d )\n", sum, num);
break;
case -1:printf("出现一个错误的单词\n");
getchar();
exit(0);
default: printf("( %-5s%5d )\n", get, num);
break;
}*/
} while (num != 0);
k = q-1;
q = 0;
printf("\n语法分析结果如下:\n");
lrparser();
system("pause");
}

二熊哥哥
- 粉丝: 0
最新资源
- 网络营销实务专题培训.pptx
- 医学院校研究生计算机应用课程教学改革探索.docx
- 下半年信息系统项目管理师考前预测题上午部分.doc
- 三维软件介绍教育课件.ppt
- 基于51单片机的智能电表设计.doc
- 新中大事行财政软件日常账务操作手册带图.doc
- 化工生产系统安全检查.doc
- 更新版国家开放大学电大专科《网络营销与策划》判断题题库及答案.pdf
- 医学数据挖掘第1章.ppt
- 青岛市地方税务局网站建设方案.doc
- 用友软件日常操作流程.doc
- 学年高中数学-第二章-算法初步-2.2.3-循环结构学案北师大版必修3.doc
- premiere影视后期制作-视频剪辑制作教程.docx
- 企业网站建设方案1.ppt
- 化妆品网络营销推广策划案.doc
- 计算机信息安全及防病毒知识讲座.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


