函数绘图语言解释器

一、实验目的

通过做上机题加深对编译器构造原理和方法的理解,巩固所学知识。

<1> 会用正规式和产生式设计简单语言的语法;

<2> 会用递归下降子程序编写编译器或解释器;

<3> 会写上机报告。

二、实验环境

Dev C++ 5.11

三、题目及要求

为函数绘图语言编写一个解释器,解释器接受用绘图语言编写的源程序,经语法和语义分析之后,将源程序所规定的图形显示在显示屏(或窗口)中。通过自己动手编写解释器,掌握语言翻译特别是语言识别的基本方法。

四、实验内容

1、词法分析器的构造

步骤:正规式-NFA-DFA-最小DFA-编写程序-测试

1.1 记号的设计

<1> 词法分析器的三个任务:

1.滤掉源程序中的无用成分;

2.输出记号供语法分析器使用;

3.识别非法输入,并将其标记为“出错记号”。

<2> 记号的组成:记号的类别和属性。

<3> 记号的数据结构:

struct Token // 记号的数据结构

{ Token_Type  type; // 类别

char * lexeme; // 属性,原始输入的字符串

double value; // 属性,若记号是常数则是常数的值

double (* FuncPtr)(double);

// 属性,若记号是函数则是函数指针

};

<4> 函数绘图语言中记号的分类与表示

enum Token_Type   // 记号的类别,共22个

{ ORIGIN, SCALE, ROT, IS,   // 保留字(一字一码)

TO, STEP, DRAW,FOR, FROM, // 保留字

T,   // 参数

SEMICO, L_BRACKET, R_BRACKET, COMMA,// 分隔符

PLUS, MINUS, MUL, DIV, POWER, // 运算符

FUNC,   // 函数(调用)

CONST_ID,   // 常数

NONTOKEN,   // 空记号(源程序结束)

ERRTOKEN   // 出错记号(非法输入)

};

1.2 模式的正规式表示

1.3 区分记号的符号表

2、语法分析器的构造

2.1 语法分析器的任务:分析语言的结构

(1)为句子(表达式)构造语法树;

(2)检查程序(语句)中的语法错误。

2.2 主要工作:

(1)设计函数绘图语言的文法,使其适合递归下降分析;

(2)设计语法树的节点,用于存放表达式的语法树;

(3)设计递归下降子程序,分析句子并构造表达式的语法树;

(4)设计测试程序和测试用例,检验分析器是否正确。

2.3 函数绘图语言的文法
<1> 文法

Program   → ε| Program Statement SEMICO

Statement →  OriginStatment | ScaleStatment

|  RotStatment    | ForStatment

OriginStatment → ORIGIN IS

L_BRACKET Expression COMMA Expression R_BRACKET

ScaleStatment  → SCALE IS

L_BRACKET Expression COMMA Expression R_BRACKET

RotStatment → ROT IS Expression

<2> 改写文法为无二义文法

<3> 消除左递归和提取左因子

消除program产生式的左递归

Program    → Program Statement SEMICO |ε

Program   → ε Program’

Program’ →  Statement SEMICO Program’|ε

Program  → Statement SEMICO Program |ε

<4> 改写左结合的产生式为EBNF形式(避免子程序调用)

改写为EBNF形式,以减少不必要的子程序调用。

Program  → { Statement SEMICO }的子程序:

void Program()

{  while (token != NONTOKEN)

{ Statement(); MathchToken(SEMICO); }

}

3、语法制导翻译绘制图形

3.1 绘图语言的语义

(1)表达式值的计算:深度优先后序遍历语法树

(2)图形的绘制:画出每个坐标点

3.2 绘图所需的语义处理:

(1)从origin、rot和scale中得到坐标变换所需的信息;

(2)for_draw语句根据t的每一个值进行如下处理:

计算被绘制点的横、纵坐标值;

根据坐标变换信息进行坐标变换,得到实际坐标;

根据点的实际坐标画出该点。

3.3 语法制导翻译的基本步骤

(1)为文法符号设计属性;

(2)设计语义规则中所需的辅助函数;

(3)为产生式设计语义规则。

3.4 语义函数的设计

<1> 全程变量:

double Parameter=0;     // 为参数T分配的变量

double Origin_x=0.0, Origin_y=0.0;// 用于记录平移距离

double Rot_ang=0.0;     // 用于记录旋转角度

double Scale_x=1, Scale_y=1;     // 用于记录比例因子

<2> 辅助语义函数

a) 计算表达式的值:深度优先后序遍历语法树

double GetExprValue(struct ExprNode * root);

b) 计算点的坐标值:首先获取坐标值,然后进行坐标变换

static void CalcCoord( struct ExprNode * x_nptr,

struct ExprNode * y_nptr,

double &x_val,

double &y_val);

c) 绘制一个点(与环境有关):

void DrawPixel(unsigned long x, unsigned long y);

d) 循环绘制所有的点:

void DrawLoop(  double Start,

double End,

double Step,

struct ExprNode * HorPtr,

struct ExprNode * VerPtr);

4、解释器的源程序组织(看实际环境)

一、心得体会

  C++对C的发展不仅是提供了对面向对象方法的支持,还扩展了常量定义、类属机制、异常处理,等等;灵活利用C++提供的机制可提高程序的可读性与可维护性;低层次的语言支持机制,可以给程序员以更大的灵活性,并产生更高效的目标代码;

 通过编译原理的实验,在自已动手体验的情况下,我们更加透彻地理解了词法分析的过程以及该算法。对于以后由模型向程序代码的转化能力上,有了很大的锻炼。我们会更加专心的研究计算机知识,不断将现实中遇到的实际问题,向程序方面转变,做到灵活运用所学知识。

原文地址:https://www.cnblogs.com/ku1274755259/p/11108397.html

时间: 2024-10-06 18:47:13

函数绘图语言解释器的相关文章

&lt;编译原理 - 函数绘图语言解释器(1)词法分析器 - python&gt;

<编译原理 - 函数绘图语言解释器(1)词法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 解释器分为三个实现块: 词法分析器:用于识别一条语句中的关键词是否符合预先定义的规则. 语法分析器:用来确定一条语句是否满足语法规则. 解释器:用来确定满足语法规则的句子,在意思上是否符合要求. 设计思路: 设计记号:词法分析器读取一个序列并根据构词规则把序列转化为记号流 定义一个字典:把所有符合一个模式的保留字.常量名.参数名.函数名等放进字

&lt;编译原理 - 函数绘图语言解释器(3)解释器 - python&gt;

<编译原理 - 函数绘图语言解释器(3)解释器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 设计思路: 将语法分析器并入绘图功能 继承语法分析器覆盖重写 用Pycharm写了一个.py文件: parserclass.py 输入流是语法分析器得到的语法树,输出流是绘制的图像 测试文本序列: //----------------测试程序1:分别测试------------------------ ORIGIN IS (100,300); //

那些年,我追过的绘图语言(续)

https://zhuanlan.zhihu.com/p/19901245 **************************** 那些年,我追过的绘图语言(续) 陈天 3 年前 自从上一篇文章发布后,大家给我推荐了不少绘图工具,比如startUML,rose,TikZ package,flowchart.js,matlab,R等等.感兴趣的可以自行研究.至于matlab/R这样的工具,虽然强大,但跟本文讨论的画一般意义的设计图(如uml图)无关. 鉴于很多读者想进一步了解plantUML,这

Linux -- Web服务器配置之用户认证;Perl语言解释器的安装

一.用户认证 用户认证在网络安全中是非常重要的技术之一,它是保护网络系统资源的第一道防线.用户认证控制着所有登录并检查访问用户的合法性,其目标是仅让合法用户以合法的权限访问网络系统的资源.当用户第一次访问了启用用户认证目录下的任何文件,浏览器会显示一个对话框,要求输入正确的登录用户名和口令进行用户身份的确认.若是合法用户,则显示所访问的文件内容.此后访问该目录的每个文件时,浏览器会自动送出用户名和密码,不用再输入了,直到关闭浏览器为止.用户认证功能起到了一个屏障的作用,限制非授权用户非法访问一些

专业函数绘图软件Origin

首先:Origin软件已经是科研院所等单位的必备工作软件之一,之所以大家讨论得较少,有可能并不是其上手难度低,而是这些使用人群的学习理解能力要相对高一点吧: 其次:Excel不垃圾,但在函数绘图方面,比起Origin差远了,用垃圾来形容并不过分,可以问问任何高校老师,他们还会使用Excel出图么?那简直是自己找死.当然Origin也只是在绘图方面比Excel厉害,其它的方面还是比Excel差,本文也只是讲了绘图方面. Origin为OriginLab公司出品的较流行的专业函数绘图软件,是公认的简

3203 数组做函数参数----排序函数--C语言版

3203: 数组做函数参数----排序函数--C语言版 时间限制: 1 Sec  内存限制: 128 MB提交: 253  解决: 151[提交][状态][讨论版][命题人:smallgyy] 题目描述 定义一个函数来完成对参数数组中元素的排序工作,函数声明如下: void sort(int array[ ]);//该函数完成对array数组的排序工作 在以下程序的基础上,完成对sort函数的定义,提交时,只提交sort函数的定义即可. #include <stdio.h> void sort

3204: 数组做函数参数--排序函数2--C语言

3204: 数组做函数参数--排序函数2--C语言 时间限制: 1 Sec  内存限制: 128 MB提交: 211  解决: 143[提交][状态][讨论版][命题人:smallgyy] 题目描述 定义一个函数来完成对参数数组中元素的排序工作,函数声明如下: void sort(int array[ ],int n);//该函数完成对array数组的前n个元素的排序工作 在以下程序的基础上,完成对sort函数的定义,提交时,只提交sort函数的定义即可. #include <stdio.h >

memcopy()函数c语言实现和汇编实现比较

今天突然心血来潮想起我前一家公司面试时遇到的一个面试题,就是实现个memcopy()函数.当初太紧张(刚毕业第二次面试),所以写的不是很好(可以说漏洞百出):现在刚学了点汇编,刚好就用两种语言实现下: 首先来看汇编实现的memcpy函数,是利用宏函数来实现的,用汇编指令rep和movsb配合循环把数据以字节为单位从ds:esi传送到es:edi中,把循环次数放在ecx中.当然这样拷贝的才是真正的内存拷贝,其他的函数都稍微有点牵强. #define myMemcpy(dest, src, n) (

python像matlab类似的符号函数绘图

matplotlib 绘图之前需要先定义数据范围,python 有一个 sympy 包,类似 matlab 里面的符号函数,可以用来进行二维和三维的图像绘制, from sympy.plotting import plot3d或者plot(二维)from sympy import symbols(用来定义符号变量)from sympy.functions import sin(用来调用已经含有的一些函数名称,比如常见的sin,cos,exp)等 . 还有一个更方便的 mpmath 包,可以结合