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
随机推荐
- ios如何一个证书多台设备测试
在苹果开发者网站申请的证书,是授权mac设备的开发或者发布的证书,这意味着一个设备对应一个证书,但是99美元账号只允许生成3个发布证书,两个开发证书,这满足不了多mac设备的使用,使用p12文件可以解 ...
- Web前端发展前景及就业方向
Web前端发展前景及就业方向 HTML5技术已经日趋成熟 Html5是移动互联网前端的主流开发语言,目前还没有一个前端的开发语言能取代 html5的位置,所以说,无论你是做手机网站还是在手机app应用 ...
- ThinkPHP动态版本控制
动态版本控制可以根据时间戳来实现,但是这样的话,每次打开页面都会重新下载加了版本控制的文件,如果你的页面自身打开本来就慢的话, 这样一来,无疑会带来很差的用户体验. 但是如果在每个引用文件后面都手动加 ...
- mysql缓存
<cache/>字面上看就是这样.这个简单语句的效果如下: 映射语句文件中的所有 select 语句将会被缓存. 映射语句文件中的所有 insert, update 和 delete ...
- python基础之文件操作
对于文件操作中最简单的操作就是使用print函数将文件输出到屏幕中,但是这种操作并不能是文件保存到磁盘中去,如果下调用该数据还的重新输入等. 而在python中提供了必要的函数和方法进行默认情况下的文 ...
- CentOS7安装Oracle 11gR2 安装
概述 Oracle 在Linux和window上的安装不太一样,公司又是Linux系统上的Oracle,实在没辙,研究下Linux下Oracle的使用,oracle默认不支持CentOS系统安装,所以 ...
- poj 3069 Saruman's Army
Saruman's Army Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8477 Accepted: 4317 De ...
- ajax 传递JSON对象参数
https://msdn.microsoft.com/zh-cn/library/cc836466(v=vs.94).aspx https://msdn.microsoft.com/zh-cn/lib ...
- PRML读书后记(一): 拟合学习
高斯分布·拟合 1.1 优美的高斯分布 中心极限定理[P79]证明均匀分布和二项分布在数据量 $N\rightarrow \infty$ 时,都会演化近似为高斯分布. 作为最晚发现的概率分布,可以假设 ...
- chrome控制台调试学习笔记 暂未整理
15:03 2015/12/7chrome控制台调试学习:推荐博客:http://www.cnblogs.com/Wayou/p/chrome-console-tips-and-tricks.html ...