一个简单的EBNF范式的实现

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

至于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;

}


From: http://www.cnblogs.com/computer-lzy/archive/2009/10/09/1579835.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值