#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语言语法分析器的更多相关文章

  1. <编译原理 - 函数绘图语言解释器(2)语法分析器 - python>

    <编译原理 - 函数绘图语言解释器(2)语法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 设计思路: 设计函数绘图语言的文法, ...

  2. 03.从0实现一个JVM语言系列之语法分析器-Parser-03月01日更新

    从0实现JVM语言之语法分析器-Parser 相较于之前有较大更新, 老朋友们可以复盘或者针对bug留言, 我会看到之后答复您! 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个 ...

  3. 开源语法分析器--ANTLR

      序言 有的时候,我还真是怀疑过上本科时候学的那些原理课究竟是不是在浪费时间.比方学完操作系统原理之后我们并不能自己动手实现一个操作系统:学完数据库原理我们也不能弄出个像样的DBMS出来:相同,学完 ...

  4. 语法分析器初步学习——LISP语法分析

    语法分析器初步学习——LISP语法分析 本文参考自vczh的<如何手写语法分析器>. LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)( ...

  5. PL真有意思(二):程序设计语言语法

    前言 虽然标题是程序语言的语法,但是讲的是对词法和语法的解析,其实关于这个前面那个写编译器系列的描述会更清楚,有关语言语法的部分应该是穿插在整个设计当中的,也看语言设计者的心情了 和英语汉语这些自然语 ...

  6. Go语言语法汇总(转)

    Go语言语法汇总 分类: 技术2013-09-16 14:21 3007人阅读 评论(0) 收藏 举报 go语言golang并发语法   目录(?)[+]   最近看了看GoLang,把Go语言的语法 ...

  7. 编译原理简单语法分析器(first,follow,分析表)源码下载

    编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...

  8. Tiny语法分析器(递归下降分析法实现)

    递归规约规则是这样的 program→stmt-sequence stmt-sequence→stmt-sequence;statement|statement statement→if-stmt|r ...

  9. 有没有好用的开源sql语法分析器? - 匿名用户的回答 - 知乎

    有没有好用的开源sql语法分析器? - 匿名用户的回答 - 知乎 presto,hive,drill,calcite,sparksq

随机推荐

  1. testng教程之testng.xml的配置和使用,以及参数传递

    昨天学习了一下testng基础教程,http://www.cnblogs.com/tobecrazy/p/4579414.html 昨天主要学习的是testng 的annotation基本用法和生命周 ...

  2. virtualbox之usb设备的分配

    来源:http://www.cnblogs.com/fsjohnhuang/p/3987545.html 首先下载安装virtualbox的扩展包,因为box原本不支持usb设备.www.virtua ...

  3. virtualbox

    下载安装:http://wiki.centos.org/zh/HowTos/Virtualization/VirtualBox

  4. 倒计时simple 天时分秒

    new Date()new Date(yyyy,mth,dd,hh,mm,ss); //月从0计数 .getTime()返回的是一个long型的毫秒数 毫秒转成 秒 分 时 天 <div id= ...

  5. 【python】继承关系和isinstance

    来源:廖雪峰 继承关系是: object -> Animal -> Dog -> Husky 那么,isinstance()就可以告诉我们,一个对象是否是某种类型.先创建3种类型的对 ...

  6. LeetCode 27 Remove Element

    Problem: Given an array and a value, remove all instances of that value in place and return the new ...

  7. 由一段字符串中查找URL引出——正则表达式

    需求很简单,是从一段文本中匹配出其中的超链接.基本的做法就是用正则表达式去匹配.但是有这样一个问题. 网上大部分的识别URL的正则表达式url末尾有空格的情况下可以正确识别.比如这样的情况: &quo ...

  8. CS224d assignment 1【Neural Network Basics】

    refer to: 机器学习公开课笔记(5):神经网络(Neural Network) CS224d笔记3--神经网络 深度学习与自然语言处理(4)_斯坦福cs224d 大作业测验1与解答 CS224 ...

  9. 如何快速地从mongo中提取数据到numpy以及pandas中去

    mongo数据通常过于庞大,很难一下子放进内存里进行分析,如果直接在python里使用字典来存贮每一个文档,使用list来存储数据的话,将很快是内存沾满.型号拥有numpy和pandas import ...

  10. ajax 传递JSON对象参数

    https://msdn.microsoft.com/zh-cn/library/cc836466(v=vs.94).aspx https://msdn.microsoft.com/zh-cn/lib ...