博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个简单的EBNF范式的实现
阅读量:7040 次
发布时间:2019-06-28

本文共 1782 字,大约阅读时间需要 5 分钟。

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

转载于:https://www.cnblogs.com/ct0421/p/3371628.html

你可能感兴趣的文章
UWP开发-在UWP中使用sqlite
查看>>
TCP_Wrappers
查看>>
java保留两位小数4种方法
查看>>
79.员工薪水报表 Extjs 页面
查看>>
RequireJS学习笔记
查看>>
js中拼接HTML方式方法及注意事项
查看>>
最新版redis的安装及配置 linux系统
查看>>
MyBatis JdbcType 与Oracle、MySql数据类型对应关系详解
查看>>
【shell】shell编程(五)-读取参数
查看>>
Easyui numberbox获取焦点事件
查看>>
SpringBoot(八)-- 日志
查看>>
php的依赖注入容器
查看>>
Lua 调试库
查看>>
ARKit从入门到精通(5)-ARScnView介绍
查看>>
remmina rdp远程连接windows
查看>>
BeautifulSoup
查看>>
终于记住回车和换行cr lf的来由和含义了 -参考: http://www.cnblogs.com/me115/archive/2011/04/27/2030762.html...
查看>>
引用CSS文件到html网页里方法
查看>>
python管道pipe
查看>>
Promise原理与实现探究的一种思路
查看>>