C语言语法分析器
#include <stdio.h>
#include <string.h>
char prog[], token[];
char ch;
int syn,p,m,n,sum;
char * rwtab[]= {"begin","if","then","while","do","end"}; main()
{
p=;
printf("\n 请输入字符串: \n");
do{
ch=getchar();
prog[p++]=ch;
}while (ch!='#');
p=;
do{
scaner();
switch(syn)
{
case : printf("\n(%d,%d)",syn,sum); break;
case -: printf("\n(%s,出错!)",token);break;
default: printf("\n(%d,%s)",syn, token);
}
}while (syn!=);
printf("\n 分析成功 \n");
p=;
scaner();
E();
if (syn==)
printf("\n 没有错误. \n");
else printf("\n 出现错误. \n");
} scaner()
{
for (n=;n<;n++) token[n]=NULL;
m=;
sum=;
ch=prog[p++];
while (ch==' ') {ch=prog[p++];}
if (ch>='a'&& ch<='z')
{while (ch>='a'&& ch<='z'||ch>='' && ch<='')
{
token[m++]=ch;
ch=prog[p++];
} syn=;p--;
for (n=;n<;n++)
if(strcmp(token,rwtab[n])==) {syn=n+;break;}
}
else
if(ch>='' && ch<='')
{while (ch>='' && ch<='') {sum=sum*+(ch-''); ch=prog[p++];}
syn=;p--;
}
else
switch(ch)
{
case '<': token[m++]=ch;
ch=prog[p++];
if (ch=='>') {syn=;token[m++]=ch;}
else if (ch=='=') {syn=;token[m++]=ch;}
else {syn=;p--;}
break; case '>': m=; token[m++]=ch;
ch=prog[p++];
if (ch=='='){syn=;token[m++]=ch;}
else {syn=;p--;}
break;
case ':': m=; token[m++]=ch;
ch=prog[p++];
if (ch=='='){syn=;token[m++]=ch;}
else {syn=;p--;}
break;
case '+': syn=;token[]=ch;break;
case '-': syn=;token[]=ch;break;
case '*': syn=;token[]=ch;break;
case '/': syn=;token[]=ch;break;
case '=': syn=;token[]=ch;break;
case ';': syn=;token[]=ch;break;
case '(': syn=;token[]=ch;break;
case ')': syn=;token[]=ch;break;
case '#': syn=; token[]=ch;break;
default: syn=-;token[]=ch;
}
} E()
{printf("E ");
T();
E1(); } E1()
{printf("E1 ");
if (syn==) {
scaner();
T();
E1();
}
else {
if (syn!= && syn!=) error();
}
} T()
{printf("T ");
F();
T1();
} T1()
{printf("T1 ");
if (syn==) {
scaner();
F();
T1();
}
else {
if (syn!= && syn!= && syn!=) error();
}
} F()
{printf("F ");
if (syn==) {
scaner();
E();
if(syn==) scaner();
else error();
}
else if (syn== || syn==) scaner(); }
error()
{
printf("\n (%d,%s)错误地方! \n",syn, token);
}
运行结果:
C语言语法分析器的更多相关文章
- <编译原理 - 函数绘图语言解释器(2)语法分析器 - python>
<编译原理 - 函数绘图语言解释器(2)语法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 设计思路: 设计函数绘图语言的文法, ...
- 03.从0实现一个JVM语言系列之语法分析器-Parser-03月01日更新
从0实现JVM语言之语法分析器-Parser 相较于之前有较大更新, 老朋友们可以复盘或者针对bug留言, 我会看到之后答复您! 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个 ...
- 开源语法分析器--ANTLR
序言 有的时候,我还真是怀疑过上本科时候学的那些原理课究竟是不是在浪费时间.比方学完操作系统原理之后我们并不能自己动手实现一个操作系统:学完数据库原理我们也不能弄出个像样的DBMS出来:相同,学完 ...
- 语法分析器初步学习——LISP语法分析
语法分析器初步学习——LISP语法分析 本文参考自vczh的<如何手写语法分析器>. LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)( ...
- PL真有意思(二):程序设计语言语法
前言 虽然标题是程序语言的语法,但是讲的是对词法和语法的解析,其实关于这个前面那个写编译器系列的描述会更清楚,有关语言语法的部分应该是穿插在整个设计当中的,也看语言设计者的心情了 和英语汉语这些自然语 ...
- Go语言语法汇总(转)
Go语言语法汇总 分类: 技术2013-09-16 14:21 3007人阅读 评论(0) 收藏 举报 go语言golang并发语法 目录(?)[+] 最近看了看GoLang,把Go语言的语法 ...
- 编译原理简单语法分析器(first,follow,分析表)源码下载
编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...
- Tiny语法分析器(递归下降分析法实现)
递归规约规则是这样的 program→stmt-sequence stmt-sequence→stmt-sequence;statement|statement statement→if-stmt|r ...
- 有没有好用的开源sql语法分析器? - 匿名用户的回答 - 知乎
有没有好用的开源sql语法分析器? - 匿名用户的回答 - 知乎 presto,hive,drill,calcite,sparksq
随机推荐
- .NET LINQ 筛选数据
筛选数据 筛选指将结果集限制为只包含那些满足指定条件的元素的操作. 它又称为选择. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 OfType ...
- 理解JavaScript中的作用域和上下文
JavaScript对于作用域(Scope)和上下文(Context)的实现是这门语言的一个非常独到的地方,部分归功于其独特的灵活性. 函数可以接收不同的的上下文和作用域.这些概念为JavaScrip ...
- DIV+CSS 清除浮动方法总结
DIV+CSS 清除浮动是页面布局中常见的问题,相信各位高手也都有自己的方法,今天在这里对常见的几种方法进行总结(PS:谈不上是原创,这里是我自己做的归纳总结,也是我自己内化的过程),希望对您能够有所 ...
- 仿qq联系人 学习笔记---ExpandableListActivity的使用
[转]原地址 http://blog.163.com/xygzx@126/blog/static/237809502011102010100331/ 效果显示图: 1.布局文件 main.xml(E ...
- 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】
一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...
- Asp.net通过模板(.dot/Html)导出Word,同时导出图片
一.Office组件导出Word(服务器配置麻烦) 需要引用Office的DLL,在下文的附件中,不同的Offic版本用的不一样,虽然高级版本可以兼容低级的,不过,还是统一版本最好 贴上核心代码(转载 ...
- java web.xml配置详解
1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...
- OpenFOAM 学习路线 【转载】
"Two weeks of playing with a CFD code will save you one afternoon of reading" 什么是OpenFOAM( ...
- history.back新页面跳转
今天遇到一个问题,页面跳转失效,原因在于原来在本页面打开的页面现在改为在新页面打开,历史url记录找不到了,所以不能向上一个地址跳转,解决的办法是使用$_SERVER['HTTP_REFERER']获 ...
- [开源]用MQL4实现MD5加密
本文转载自博客园:混沌的世界 原文地址:http://www.cnblogs.com/niniwzw/archive/2009/12/05/1617685.html 在用MQL4进行金融交易的时候,经 ...