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
随机推荐
- C Primer Plus_第9章_函数_编程练习
1.题略 /*返回较小值,设计驱动程序测试该函数*/ #include <stdio.h> double min (double a, double b); int main (void) ...
- JavaScript高级程序设计学习笔记--事件
HTML事件处理程序 <input type="button" value="Click Me" onclick"showMessage()&q ...
- ORA-27101: shared memory realm does not exist
Oracle Error Tips by Burleson Consulting Oracle docs note this about ORA-27101: ORA-27101: shared me ...
- 计算机网络中的帧封装(C实现)
这段时间开始复习计算机网络,看到帧封装这一节,结合以前的课程设计,就用C写了个帧封装的程序,说实话C学的确实不怎么样,实现的时候对于文件操作那部分查了好多资料,下面说说帧封装是啥情况. 学过计算机网络 ...
- Git版本控制管理学习笔记1-介绍
几乎所有的版本控制工具都是出于同样的目的:开发以及维护开发出来的代码,方便读取代码的历史,记录所有的修改.这里,介绍的是当前在开源社区内非常流行的版本控制工具Git.它是由Linus Torvalds ...
- 添加已运行daemon进程(falcon-agent)到supervisor测试
falcon-agent now is running already, pid= falcon-agent now is running already, pid= falcon-agent now ...
- Linux下xampp集成环境安装配置方法 、部署bugfree及部署禅道
XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包.XAMPP 是一个易于安装且包含 MySQL.PHP 和 Perl 的 Apache 发行版.XAMPP 的确非 ...
- 【Cocos2d-x游戏开发】Cocos2d-x中的弱联网技术
在上一篇博客中,我们一起学习了如何在Cocos2d-x中存储数据和读取信息,本篇博客我们将一起讨论和数据存储同样重要的联网技术. 一.弱联网技术介绍 在网络游戏中许多重要的功能都需要网络连接,而根据需 ...
- C# 与 C++ 数据类型比较及结构体转换
引自:http://www.blogjava.net/heting/archive/2010/03/20/315998.html C++ C# =============== ...
- oracle 取小数位数
select ltrim('124532.62879'-floor('124532.62879'),'0.') from dual;select length(66695) from dual; 这两 ...