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

部分代码来自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;
}

与君共勉

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 14:49:16

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

算术表达式解析(第三版)词法分析版

以前写过两版算术表达式解析代码,但都是基于栈结构或者树模型的,并不是通用的算法.其实算术表达式解析是最基本的词法分析算法,直到我看了<自制编程语言>里面介绍的递归向下分析法,才明白这种问题的终极解决方案是使用词法分析和语法分析.. //用于词法定界的头文件 token.h 1 #ifndef _TOKEN_H_VERSION_20140930 2 #define _TOKEN_H_VERSION_20140930 3 4 enum TokenKind{ 5 BAD_TOKEN, 6 NUMBE

完整cmm解释器构造实践(三):语法分析

完整cmm解释器构造实践(三):语法分析 语法树节点 我的语法分析器不仅会判断cmm代码的语法是否正确, 同时会存储分析过程中得到的信息, 完成语法树的构建. 为什么要有语法树呢, 其实还是为了计算机方便做进一步的处理才用的, 语法树里面存储了从代码里面提取的信息, 我们生成语法树之后再通过遍历语法树来得到中间代码. 当然直接遍历语法树并解释执行也是可以的, 我们老师非得让我们有中间代码, 所以我的语法分析只为了生成中间代码而服务的, 虽然我的代码生成器本质上是解释器改造而成的. 那么既然语法树

使用栈实现解析算术表达式

目的 1. 使用栈将中缀表达式转换成后缀表达式 2. 使用后缀表达式求算术值 注意: 因为是简单实践,所以代码逻辑已经简化,比如只能对个位数的加减乘除进行解析.没有设异常处理等 一:需要实现一个栈 这个没什么好说的,只是一个结构很简单的栈 1 public class Stack { 2 3 private int maxSize; 4 private int top; 5 private Object[] stackArr; 6 7 public Stack(int maxSize) { 8

【Scala编程】格式化算术表达式程序

格式化算术表达式程序 为了练习模式匹配的使用,该博文介绍编写格式化算术表达式的程序,最终的呈现结果如下面这个二维布局的数学表达式所示,这里除法运算被垂直打印出来: 1 - * (x + 1) 2 ----------- x 1.5 - + --- 2 x 为了实现这个程序,我们需要做一下工作: 1. 编写一个二维布局库来创建和渲染二维布局元素.这里主要应用Scala面向对象编程的一些方法,通过组合与继承来构建简单部件,进而实现库的设计. 2. 编写一个表达式的格式化类,利用二维布局库来渲染二维字

双栈计算算术表达式

1.介绍 算术表达式的计算,是比较常见的问题,但这个问题的背后隐藏着栈的思想. 这里就介绍使用两个栈来计算表达式的方法. 2. 算法 2.1 定义: a) 建立两个栈: 一个是数据栈dataStak,用于存放数据: 一个是符号栈operatorStack,用于存放运算符: b) 建立运算符号之间的优先级表,用于比较两个符号之间的优先级: 优先级定义为三种运算结果:>(表示高于),<(表示低于),=(表示相等): 并且对于"("与")",认为两者的优先级相

栈的应用—算术表达式求值

例三.算术表达式求值 1.问题描述 当一个算术表达式中含有多个运算符,且运算符的优先级不同的情况下,如何才能处理一个算术表达式????? 2.思路 首先我们要知道表达式分为三类:  ①中缀表达式:a+(b-c/d)*e ②前缀表达式+a*-be ③后缀表达式abcd/-e*+ 由于运算符有优先级,所以在计算机中计算一个中缀的表达式非常困难,特别是带括号的更麻烦,而后缀表达式中既无运算符优先又无括号的约束问题因为在后缀表达式中运算符出现的顺序正是计算的顺序,所以计算一个后缀的表达式更简单.所以,可

Linux课题实践三——字符集总结与分析

Linux课题实践三——字符集总结与分析 20135318  刘浩晨 字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集.GB2312字符集.BIG5字符集. GB18030字符集.Unicode字符集等. 1.总结ISO.UCS/UTF.GB系列字符集的由来.异同 (1).ISO/IEC ISO/IEC 646:是国际标准化组织(ISO)及国际电工委员会(IEC)联合制定

简单算术表达式的求值程序

题目: 写一个三则运算(加减乘)表达式的求值程序,为了简化,规定数字只有一位,表达式内没有空格,但允许有括号.满足四则运算的结合性和优先级. 解答: 这是一道编译原理题,题目的要求把词法分析简单化了,只做语法分析.一般使用递归下降法求解. 首先写出BNF(包括结合性和优先权). exp → exp addop term | t e r m addop → + | - term → term mulop factor | f a c t o r mulop → * factor → ( exp )

Linux下的shell脚本编程-变量-算术表达式-判断语句-if分支语句

Linux下的shell脚本编程-变量-算术表达式-判断语句-if分支语句 一:实验环境 1):虚拟机 2):linux系统 二:实验目标 1): shell 基本语法 2):变量 3):表达式 4):判断语句 5): if表达式 三:实验脚本 第一块 一个简单的shell脚本程序 [[email protected] ~]# mkdir test [[email protected] test]# vim example1.sh #!/bin/bash #This is to show wha