编译器实践三 之 针对算术表达式的语法分析器

编译器实践三 之 针对算术表达式的语法分析器

大家好,又见面了,我是全栈君。

该算术表达式的上下文无关文法是:

E -> E + T

   | E – T

   | T

T -> T * F

   | T / F

   | F

F -> num

   | (E)

部分代码来自MOOC

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

void parse_F();
void parse_T();
void parse_E();
void error (char *want, char got);

int i;
char *str = 0;

void error (char *want, char got)
{
  fprintf (stderr, "Compling this expression:\n%s\n", str);
  int j = i;
  while (j--)
    fprintf (stderr, " ");
  fprintf (stderr, "^\n");
  fprintf (stderr, "Syntax error at position: %d\n"
           "\texpecting: %s\n"
           "\tbut got  : %c\n",
           i, want, got);
  exit (0);
  return;
}

void parse_F()
{
  char c = str[i];
  if (isdigit(c)){
    i++;
    return;
  }
  if (c=='('){
    i++;
    parse_E();
    c = str[i];
    if (c==')'){
      i++;
      return;
    }
    error ("\')\'", c);
    return;
  }
  error ("\'0-9\' or \'(\'", c);
  return;
}


void parse_T()
{
  parse_F();
  char c = str[i];
  while (c=='*' || c =='/'){
    i++;
    parse_F();
    c = str[i];
  }
  return;
}

void parse_E()
{
  parse_T();
  char c = str[i];
  while (c=='+' || c == '-'){
    i++;
    parse_T();
    c = str[i];
  }
  return;
}

void parse (char *e)
{
  str = e;
  i = 0;
  parse_E();
  if (str[i]=='\0')
    return;
  error ("\'+\' or '\\0\'", str[i]);
  return;
}
///////////////////////////////////////////////
// Your job:
// Add some code into the function parse_E() and
// parse_T to parse "-" and "/" correctly.
// When you finish your task, NO error message
// should be generated.
// Enjoy! :-P
int main (char argc, char **argv)
{
  // There are the following rules on an expression:
  //   1. Every expression is represented as a string;
  //   2. integers are non-negative;
  //   3. integers are between 0-9.
  char *e;

  e = "(2)";
  parse(e);

  e = "(3+4*5))";
  parse(e);

  e = "(8-2)*3";
  parse(e);

  e = "(8-2)/3";
  parse(e);
  
  return 0;
}


与君共勉

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116060.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹

    1、将一个文件夹下的所有内容复制到另一个文件夹下cp-r/home/packageA/*/home/cp/packageB/或cp-r/home/packageA/./home/cp/packageB/这两种方法效果是一样的。方法示例:2、将一个文件夹复制到另一个文件夹下cp-r/home/packageA/home/packageB运行命令之后packa…

    2022年4月4日
    323
  • Loading class `com.mysql.jdbc.Driver’. This is deprecated警告处理,jdbc更新处

    Loading class `com.mysql.jdbc.Driver’. This is deprecated警告处理,jdbc更新处声明:使用JDK9、MYSQL8、idea  1.报错信息是这样的;处理:提示信息表明数据库驱动com.mysql.jdbc.Driver’已经被弃用了、应当使用新的驱动com.mysql.cj.jdbc.Driver’所以,按照提示更改jdbc.properties配置 .com.mysql.jdbc.Driver 改为 com.mysql.cj.jdbc.Driver…

    2022年6月23日
    41
  • Windows Server服务器上DNS服务器配置方法[通俗易懂]

    Windows Server服务器上DNS服务器配置方法[通俗易懂]图解WindowsServer服务器上DNS服务器配置 本篇经验将和大家介绍WindowsServer服务器上DNS服务器配置的步骤,希望对大家的工作和学习有所帮助!DNS服务器安装 1  打开“添加角色”,安装DNS服务。点击下一步,安装,开始启动dns服务器进行配置,如下图所示: 2 首先配置dns服务器,如下图所示: 3  进…

    2022年6月4日
    47
  • 四阶行列式的计算方法余子式_三阶行列式降价

    四阶行列式的计算方法余子式_三阶行列式降价四阶行列式的计算;N阶特殊行列式的计算(如有行和、列和相等);矩阵的运算(包括加、减、数乘、乘法、转置、逆等的混合运算);求矩阵的秩、逆(两种方法);解矩阵方程;含参数的线性方程组解的情况的讨论;齐次、非齐次线性方程组的求解(包括唯一、无穷多解);讨论一个向量能否用和向量组线性表示;讨论或证明向量组的相关性;求向量组的极大无关组,并将多余向量用极大无关组线性表示;将无关组正交化、单位化;求方阵的特…

    2025年5月27日
    2
  • 远程连接工具SecureCRTPortable连接不上linux的解决方法[通俗易懂]

    远程连接工具SecureCRTPortable连接不上linux的解决方法[通俗易懂]今天学习linux用远程工具连接时,连接不上,出现了一个类似函数的东西,运用了排除法,1.先检查了虚拟机服务是否开启2.然后ping网关看能通吗3.然后pingDNS域名,再pingwww.baidu.com都能ping通,百思不得其解然后通过查资料,输入route发现default后面并没有分配默认网关于是输入routeadddefaultgw192.168…

    2022年5月8日
    335
  • 不再年轻,尽管如此一遍

    不再年轻,尽管如此一遍

    2022年1月7日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号