资源简介
了解用算符优先法对表达进行语法分析的方法,掌握自顶向下的预测语法分析程序的手工构造方法。
附加功能:
1. 循环输入表达式和输出结果
2. 输出表达式对应的后缀表达式
代码片段和文件信息
#include “stdio.h“
#include “string.h“
#include “ctype.h“
#include “malloc.h“
#define N 1000
typedef struct input *Pin;//表达式链结点
struct input
{
int info;//数字用数值存储,符号用对应的ASCII码存储
int type;//标记:0为数字,1为符号
Pin next;
}head;
typedef struct node *pnode;//栈结点
struct node
{
int info; //结点内容
pnode next;
};
struct linkStack
{
pnode top;
};
typedef struct linkStack * PlinkStack;
PlinkStack OPTROPND;//符号栈、数值栈
Pin E;
Pin now;
char in[N];
int top(PlinkStack plstack);//取栈顶元素
void push(PlinkStack plstackint n);//入栈
int pop(PlinkStack plstack);//出栈
int signature(int n);//符号处理模块
int transform(int c);//将运算符转换成符号分析表中的坐标
int cmp(int iint j);//查符号分析表,返回优先级
int less(Pin E);//符号表小于操作
int equal(Pin E);//符号表等于操作
int greater(Pin E);//符号表大于操作
void change();////将输入字符串转化为链表,在输入表达式前后各加一个#
void start();//获得输入字符,检测其合法性
Pin provide();//每次调用时返回一个结点
int main()
{
int flag1=1flag2=1tempvalue;
OPND = (struct linkStack *) malloc (sizeof(struct linkStack));
OPTR = (struct linkStack *) malloc (sizeof(struct linkStack));
while(flag1)//控制可以循环输入表达式
{
flag2 = 1;
OPND->top = NULL;
OPTR->top = NULL;
push(OPTR‘#‘);
start();//获得输入字符,检测其合法性
printf(“后缀表达式:“);
while(flag2!=0)
{
E=provide();//获得一个结点,数字/符号
if(E->type==0)//数字处理
{
printf(“%d “E->info);//输出后缀式子控制
push(OPNDE->info);
}
else if(E->type==1)//符号处理
{
temp=signature(E->info);
if(temp == 1)
{
value = pop(OPND);//表达式的值
flag2=0;
}
}
else
{
printf(“无法获得结点信息!\n“);
}
}
printf(“\n表达式的值为:%d\n“value);
printf(“\n“);
}
}
void start()//获得输入字符,检测其合法性
{
head.next=NULL;
now=&head;
int i;
int len;
bool pass=true;
int flag=0;
while(pass)
{
printf(“请输入表达式:“);
scanf(“%s“in);
len=strlen(in);
for(i=0;i {
if((in[i]>=‘0‘&&in[i]<=‘9‘)||(in[i]==‘+‘)||(in[i]==‘-‘)||(in[i]==‘*‘)||(in[i]==‘/‘)||(in[i]==‘(‘)||(in[i]==‘)‘))
{
if(!(in[i]>=‘0‘&&in[i]<=‘9‘)&&!(in[i+1]>=‘0‘&&in[i+1]<=‘9‘))
{
if(!(in[i]==‘)‘||in[i+1]==‘(‘))
{
flag=1;
printf(“表达式有误!\n\n“);
}
if(in[i]==‘)‘&&in[i+1]==‘(‘)
{
flag=1;
printf(“表达式有误!\n\n“);
}
}
else if((in[i]>=‘0‘&&in[i]<=‘9‘&&in[i+1]==‘(‘)||(in[i]==‘)‘&&in[i+1]>=‘0‘&&in[i+1]<=‘9‘))
{
flag=1;
printf(“表达式有误!\n\n“);
}
}
else
{
flag=1;
printf(“错误:非法字符!\n\n“);
}
}
if(flag==1)
{
flag=0;
pass=true;
}
else
pass=false;
}
change();
}
void change()//将输入字符串转化为链表,在输入表达式前后各加一个#
{
int num=0;
char *p*q;
p=&in[0];
q=&in[1];
while(*p!=‘\0‘)
{
if(*p>=‘0‘&&*p<=‘9‘)
{
num=num*10+(*p-‘0‘);
if(
- 上一篇:LL1分析法实验报告
- 下一篇:C语言实现银行存款信息管理系统
相关资源
- c++语法查询工具
- 算法表达式求值.cpp
- C++学习指南语法篇代码+pdf(pdf可直接
- 正则表达式(regex)C语言源码,超强
- 语法分析c语言实现程序代码+实验报告
- 实现语法分析器-编译原理
- LL(1)文法分析全过程(FIRST/FLLOW/S
- 语法分析器 tiny语言语法分析
- C++语法分析器
- 语法分析c语言实现含报告
- MFC表达式计算器
- 数据结构课程设计:表达式求值,C
- C语言实现了crontab表达式执行时间
- 简单LISP算术表达式计算器
- LL1语法分析器(c++)
- 基于MFC的简易计算器表达式解析
- 编译原理课程设计----语法分析器(
- 编译原理课程实验报告词法分析器及
- PL0编译器词法检查与语法分析器
- ultraedit 各种语法高亮着色官方文档比
- LL(1)语法分析器C++版
- 编译技术实验(Pascal代码转汇编语言
- c++ 字符串表达式求值
- LR(0)语法分析器程序
- C++后缀表达式计算器MFC功能强大
- TINY扩充语言的语法分析(实现 while、
- 编译原理课程设计词法语法分析器
- 编译原理LL1语法分析器C++版源代码
- 第四次上机作业 语法分析2
- 对于任意给定的输入串词法记号流进
评论
共有 条评论