一个简单的EBNF范式的实现
来源:互联网 发布:linux远程桌面windows 编辑:程序博客网 时间:2024/05/16 00:35
最近无事
在看书的时候发现了这个东西
刹那间突然觉得大学时候编译原理书上的的什么语法分析书、上下文无关等晦涩难懂的概念清晰了许多
今天把它贴出来
希望也能让你回想起些往事。。。
至于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范式的实现
- 一个简单的EBNF范式的实现
- EBNF文法的翻译
- 扩展巴科斯范式(EBNF)
- BNF范式和EBNF范式
- BNF范式和EBNF范式
- C++ 使用模版范式写一个单例模式的类--简单实现单例模式
- C++ 使用模版范式写一个单例模式的类--简单实现单例模式
- 扩展巴科斯范式(EBNF)简介
- 我的编译器 EBNF的方言
- L0范式,L1范式,L2范式的简单理解
- BNF 和EBNF的含义与用法
- BNF和EBNF的含义及其用法
- BNF和EBNF的含义及其用法
- pl0语言文法的EBNF表示
- 简单的数据库设计范式
- 第三范式的简单理解
- 数据库范式的简单理解
- 存储过程分页
- ˋ◤林志玲代言真情年代北京烤鸭惊艳亮相化身鸭子骗称这辈子太美下辈子想是做一只丑小鸭省的人追(图)①ǒ
- struts.properties
- 详解Linux内核之双向循环链表
- 狂人用Excel实现开心农场偷菜
- 一个简单的EBNF范式的实现
- P2P,UDP和TCP穿透NAT
- 多年前的自嘲
- 快捷键收集
- 14296.hghg.net/1.txt
- 股海沉浮:在这四种情形下你必须空仓
- 深度分析String类型与StringBuilder类型
- google doc的使用
- 在aspx.cs中使用windows.open打开另一个页面,并且实现参数传递