编译原理 龙书 第二章 一个简单的算术式(+,-)翻译器实现

昨天晚上决定正面硬刚神课《编译原理》。硬上龙书。

下面是 一个简单的算术式中缀变后缀的翻译器。

这个也是 龙书中 一个C实现源码 。部分用c++改写。

#include <iostream>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

int lookahead;
void error()//错误处理
{
    cout<<"error"<<endl;
    exit(1);
}

//token 用来匹配预扫描记号lookahead
void match(int t) //检测迭代函数
{
    if(lookahead == t){
    lookahead = getchar();
    }
    else error();
}

void term()//判断函数  isdigit(char c);判断输入字符是否是0~9。被包含在头文件<ctype.h>中。
{
    if(isdigit(lookahead)){
        putchar(lookahead);
        match(lookahead);
    }else error();
}

void expr()
{
    term();
    while(1)
    {
        if(lookahead == '+'){
            match('+');term();putchar('+');
        }
        else if(lookahead == '-'){
            match('+');term();putchar('-');
        }
        else break;
    }
}

int main()
{
    lookahead = getchar();
    expr();
    cout<<endl;
    return 0;
}
时间: 2024-11-01 21:20:02

编译原理 龙书 第二章 一个简单的算术式(+,-)翻译器实现的相关文章

编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译

语法制导翻译: 定义:语法制导翻译是通过向一个文法的产生式附加一些规则或程序片段而得到的 功能:给定词法单元流,通过向一个文法产生式附加一些语义动 作,语法制导分析产生语法分析树,并实现翻译动作 相关概念: 属性:表示与某个程序构造相关的任意的量,因为用文法符号(终结符号或非终结符号)来表示程序构造,所以可将属性的概念从程序构造扩展到表示这些构造的文法符号上 综合属性:如果某个属性在语法分析树节点N上的值由N的子节点和N本身的属性值确定,则该属性为综合属性,其性质为只需对语法分析树进行一次自底向

编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义

语法定义: 文法定义: 定义:用以描述程序设计语言语法的表示方法——“上下文无关文法”,简称“文法”,文法自然地描述了大多数程序设计语言构造地层次化语法结构 实例: 如果用变量expr来表示表达式,用变量stmt表示语句,则 相关概念: 产生式:使用箭头(→)表示"可以具有如下形式",用相关变量表示表达式和语句的构造规则产生的式子.每个生产式包括一个称为生产式头或左部的非终结符号,一个箭头,和一个称为生产式体或右部的由终结符号组成的序列. 终结符号:有时也称为词法单元,终结符号是该文法

现代编译原理--第二章(语法分析之LL(K))

LL(K)语法分析技术是建立在预测分析的技术之上的.我们先来了解预测分析技术.考虑以下文法: 当使用该文法对(1*2-3)+4和(1*2-3)进行分析,前者因该调用E->E+T,而后者应该调用E->T,怎么确定到底使用哪个产生式呢?这就要使用预测分析技术来构建预测分析语法分析器,LL(k)是其一种.预测分析技术的关键是构建一个无冲突的预测分析表.所谓预测分析表就是程序可以根据当前的状态来查询该表,然后确定下一步使用哪个产生式. 构建预测分析表要要用到两个集合,分别是first集合和follow

现代编译原理--第二章(语法分析之LR(1))

前面已经介绍过LL(1),以及如何使用LL(1)文法.但是LL(K)文法要求在看到K个字母的情况下必须做出预测,这相比于LR(K)文法而言就逊色很多. LR(K)文法的定义是:从左至右分析,最右推导,超前查看K个单词.先看一个例子,来对LR文法有个大致的印象. 以上就是使用LR文法对源码进行分析的例子.注意到在LR文法中只有三个动作:移进,规约和接受,这三个动作也是通过查表来得到的.任何时候如果都是唯一确定这三个动作中的一个,我们就能让LR文法正确的运行.为了更好的理解LR(K)文法,我们先介绍

学了编译原理能否用 Java 写一个编译器或解释器?

16 个回答 默认排序? RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和解释器.其实用什么语言来实现编译器并不是最重要的部分(虽然Java也不是实现编译器最方便的语言),最初用啥语言都可以. 我在大学的时候,我们的软件工程和计算机科学的编译原理课的作业好像都是可以用Java来写的.反正我印象中我给这两门课写的作业都是用的Java. ===================

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之8: Chap10: Lighting

这一章讲的是光照.光照(lighting)是Direct3D中非常重要的概念,而与之相对应的是材质(material)的概念.如果没有材质的话,那么光照的作用也无法体现. 在较早一些的关于DirectX 9的编程入门书籍里,一般是使用D3DLIGHT9结构体来建立一个光源,而用D3DMATERIAL9结构体来定义物体的材质.我们要做的就是一些很琐碎的家务活,基本上就是创建这些结构体对象.设定其中的参数.启用光照之类的,至于具体实现的细节就非吾等所需(和所能)操心的了. 不过在我们的"龙书&quo

用antlr4来实现《按编译原理的思路设计的一个计算器》中的计算器

上次在公司内部讲<词法分析--使用正则文法>是一次失败的尝试--上午有十几个人在场,下午就只来了四个听众. 本来我还在构思如何来讲"语法分析"的知识呢,但现在看来已不太可能. 这个课程没有预想中的受欢迎,其原因可能是: 1.课程内容相对复杂,听众知识背景与基础差异比较大. 2.授课技巧不够,不能把复杂的知识简单化的呈现给基础稍差一点的人. 针对这两个可能的原因,我要尝试做出以下调整: 1.使用antlr来实现词法和语法的部分. 2.暂时把"编译"过程改为

现代编译原理--第一章(词法分析)

当我们写好一份源代码,提交给编译器的时候,这是编译器对我们提交代码进行词法分析.这个整个编译过程的第一步.词法分析器将我们的提交的代码看作是一个文本,它工作的目的就是将这个文本中不符合我们所使用的语言(c++或者java)的单词(字符串)挑选出来,以及将符合语言的单词(字符串)进行分类. 对于第一个功能,挑选不合格字符串,我们可以这样理解.例如,对于c++而言,定义变量名不能使用数字开头,那么如果出现 int  1tmp:语句就是非法的. 对于第二个功能,我们一方面要确定怎么解读一个字符串.例如

irectX 9.0c游戏开发手记之“龙书”第二版学习笔记之10: Chap12: Blending

这一章讲的是Blending,包括alpha 混合和alpha 测试两个方面.这一章的内容总体来说比较简单.然而,后面的习题却并不是很简单-- 下面是习题解答部分: 习题1部分: =============================================================================== 这道题让我们研究使用不同的blend factor和blendop所产生的效果.这个实现起来不难,我就不打算详细解释了,大家都能够看懂的.另外,为了简单,我就不