最近无事
在看书的时候发现了这个东西
刹那间突然觉得大学时候编译原理书上的的什么语法分析书、上下文无关等晦涩难懂的概念清晰了许多
今天把它贴出来
希望也能让你回想起些往事。。。

至于EBNF范式是什么东西,网上有详细的介绍,在此就不作赘述。
在这里,使用EBNF范式来实现一个简单算术运算的语法描述,然后用C语言实现。

该算术运算要实现的功能:
(1)能够进行加法、乘法运算,且乘法优先于加法运算
(2)实现'('、')'运算,且其优先级高于乘法运算

使用EBNF范式修改后的简单整数算术运算的语法描述:
expr-->expr+term|term
term-->term*factor|factor
factor-->(expr)|number
number-->number digit|digit
digit-->0|1|2|3|4|5|6|7|8|9

实现代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

int token;      //holds the current input character for the parse
void error(void)
{
         printf("parse error\n");
        exit(1);
}

void getToken(void)
{
        token=getchar();
}

void match(char c)
{
        if(token==c)   getToken();
        else   error();
}

//command-->expr'\n'
void command(void)
{
        int result=expr();
         if(token=='\n')
        printf("The result is :%d\n",result);
        else error();
}

//expr-->term { '+'  term}
int expr(void)
{
        int result=term();
        while(token=='+')
        {
                match('+');
                result+=term();
        }
        return result;
}

//term-->factor { '*' factor}
int term(void)
{
        int result=factor();
        while(token=='*')
        {
                match('*');
                result*=factor();
        }
        return result;
}

//factor-->‘(’ expr ')' | number
int factor(void)
{
        int result;
        if(token=='(')
        {
                match('(');
                result=expr();
                match(')');
        }
        else
                result=number();
        return result;
}

//number-->digit { digit }
int number(void)
{
        int result=digit();
        while(isdigit(token))
        {
        result=10*result+digit();
        }
        return result;
}

//digit-->'0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'
int digit(void)
{
        int result;
        if(isdigit(token))
        {
                result=token-'0';
                match(token);
        }
        else
                error();
        return result;
}

void parse(void)
{
        getToken();
        command();
}

main()
{
        parse();
        return 0;
}

一个简单的EBNF范式的实现的更多相关文章

  1. 扩展Python模块系列(二)----一个简单的例子

    本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...

  2. 正则语言引擎:一个简单LEX和YACC结合运用的实例

    本文先描述了LEX与YACC的书写方法.然后利用LEX与YACC编写了一个简单正则语言的引擎(暂时不支持闭包与或运算),生成的中间语言为C语言. 正则引擎应直接生成NFA或DFA模拟器的输入文件,但在 ...

  3. 从一个简单的约束看规范性的SQL脚本对数据库运维的影响

    之前提到了约束的一些特点,看起来也没什么大不了的问题,http://www.cnblogs.com/wy123/p/7350265.html以下以实际生产运维中遇到的一个问题来说明规范的重要性. 如下 ...

  4. 用25行JavaScript语句实现一个简单的编译器

    原文:https://www.iteye.com/news/32680 译者注:即使对于专业程序员来说,构造一个编译器也是颇具挑战性的任务,本文将会引导你抽丝剥茧,一探究竟! 我已经写了几篇与编程语言 ...

  5. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  6. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  7. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

  8. 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...

  9. 如何开发一个简单的HTML5 Canvas 小游戏

    原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...

随机推荐

  1. 图论trainning-part-1 A. 最短路

    A. 最短路 Time Limit: 1000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d      Java class name ...

  2. Dialog共通写法(一个button)

    一个button的: package jp.co.hyakujushibank.view import android.app.Dialogimport android.content.Context ...

  3. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法】

    Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...

  4. P2014 选课 (树形动规)

    题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...

  5. 送外卖(codevs 2800)

    题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一 ...

  6. python--爬取http://www.kuaidaili.com/并保存为xls

    代码如下: 复制在python3上先试试吧^_^ # -*- coding: utf-8 -*- """ Created on Mon Jun 12 13:27:59 2 ...

  7. Yii 之Session使用

    public function actionIndex(){ $session = \YII::$app->session; //判断session是否开启 if(!$session->i ...

  8. Codeforces 848B Rooter's Song(分类+模拟)

    题目链接 Rooter's Song 题意  有n个舞者站在x轴上或y轴上,每个人有不同的出发时间.x轴上的舞者垂直x轴正方向移动,y轴上的舞者垂直y轴正方向移动. 当x轴的舞者和y轴的舞者相遇时,他 ...

  9. WebGIS开发之用openlayers加载离线百度地图

    因为项目需要,只有内网环境,没有外网环境,所以需要下载地图瓦片. 一.下载瓦片地图 这个可以自行在网上找一些地图瓦片下载器,下好的瓦片地图是分级的.大概如图这种类型. 二.在地图上显示标记 首先使用o ...

  10. hadoop+yarn+hbase+storm+kafka+spark+zookeeper)高可用集群详细配置

    配置 hadoop+yarn+hbase+storm+kafka+spark+zookeeper 高可用集群,同时安装相关组建:JDK,MySQL,Hive,Flume 文章目录 环境介绍 节点介绍 ...