当前位置:首页 » 编程软件 » 编译原理设计文档是什么

编译原理设计文档是什么

发布时间: 2025-02-10 09:41:58

⑴ 学编程后悔死了

儿童学编程后悔,让孩子学编程真是害了孩子吗

现在的家长都希望自己的孩子能够赢在起跑线上,所以从小就特别关注孩子的兴趣及学习,目前不少家长都会给自己的孩子报上一两个兴趣班,如英语、舞蹈等,除此之外编程也是非常火爆的,但是一些家长让儿童学习编程后出现后悔的情况,那么让孩子学编程真是害了孩子吗?

当下提起编程这个兴趣课程家长们都比较熟悉,它是信息学的一部分,孩子们会进行图形处理、数据库、网络知识以及热门大数据等学习,整个课程内容是非常丰富的,同时孩子在学习编程的时候还能促进他的逻辑思维,不少孩子都很感兴趣。但是一些家长出现后悔,且认为学习编程是害了孩子,主要是因为:

1、用眼过度。家长们没有较好地控制孩子使用电脑的时间,从而影响了孩子眼部健康。

2、沉迷于电脑。一些孩子学习编程以后,脱离了家长的管束,则会以学习编程为借口而玩电脑游戏等,长时间下去孩子有可能沉迷于电脑。

其实就编程的学习来说对于孩子还是有很多好处的,但是凡事都是相对的,家长们不能任孩子玩电脑,即使学习编程家长们也要做好陪伴和监管工作,特别是对于年龄小一些的孩子来说更要如此,这样相信多数家长都不会再后悔了。

不要学计算机学计算机我后悔了

之所以不建议学计算机是因为学计算机的人很多,学有所成比较困难。但是如果是真的喜欢这个行业,能花大力气学习技术,能当一名优秀的程序员就很好了。

现在学计算机不行了吗

我想第一个是这个学科的热度,在现在这个互联网社会上,计算机是人人都会用到了,用户群体大,那需求自然不少,用户对于现在的上网体验要求越来越高,这就需要一大批计算机人才。

那么学计算机的多,但是能当一个程序员,成为一个计算机专业人才的人很少,为什么呢?首先,学计算机,学编程真的没有办法一蹴而就,只能潜移默化的学习,现在软件编程语言种类繁多,各种新的框架和更好用的语言,框架,工具正在蓬勃发展,要想当一个程序员,必须要有终身学习的观念,要不然一两年就落伍了。

另一方面,在大学的计算机专业学的很多都是理论性知识,这造成了两个结果,一个是学生觉得这个很枯燥乏味,不愿学习。

另一个是与社会上的技术严重脱节,造成学生找不到工作。这样学生就更不愿意学习,在学校可能很多人就玩自己的,但是要想做一个好的程序员,在大学必须自己学习一些社会上的热门技术,互联网上有很多学习的地方,需要的话可以去看看我的文章。

再者,培训机构也是程序员的孵化地,但是培训机构一味去追逐社会热门技术,就不会像大学一样让我们学习一些理论,比如说是数据库原理,编译原理,操作系统,计算机组成原理等,再加上培训机构一般只培训几个月,

想一想,几个月把教你这么多东西,你能实际操作了,程序员最注重的就是实际操作,编程能力,如果你没有任何根基,去培训机构就是浪费自己的时间。如果你在大学学过这方面的知识,那么培训机构会对你有一些帮助,当然前提是你要学习,不过我的建议是大学自己在网上学习,毕竟培训机构收费不低。

总体上来说,学计算机的人多,但是能能有找到计算机方面工作的能力的人就不多了,能当一名优秀的程序员的人更少,如果是真的喜欢这个行业,并且有些一些坚持的恒心,能花大力气学习技术,那我相信你会有一个好的回报。

如果你只是抱着这行跟热门,想进来赚钱的话,我劝你还是算了,编程的行业是需要时间的。大学里有很多计算机专业的人大部分找工作都不是找这方面的工作,也有很多找计算机方面工作的人不是学计算机的,怎么选择全靠自己。

具备什么特质能学计算机

一、对计算机专业相关知识充满了兴趣。通过提前对计算机知识的了解和初步学习,对计算机知识和发展前景充满了兴趣,能在一个个知识点、一串串代码中找到学习的乐趣。兴趣是最好的老师,当你对一件事情充满浓厚兴趣的时候,学习状态和效果都是非常好的,学习计算机专业知识也一样。

二、有很强的自我管理、自我学习能力。仅仅通过课堂的学习时间是很难把专业知识学通、学会的,通常需要在课前课后时间自己学习,把知识点学通巩固。计算机也不是纯理论记忆的专业,不仅需要完成很多实验,编程能力也是结合知识通过不断敲打代码练就的,即使你有很强的记忆能力能在课堂时间把知识点记住,课后不进行编程训练,是学不好编程的。所以学好计算机知识需要个人很强的自我管理和自我学习能力,计算机知识不能一时兴起学一学,也不可能一蹴而就,要保持足够的耐心,投入大量的时间学习、动手实验和编程。

三、有很强的逻辑思维和计算能力。在第二点中已经说过,计算机知识单靠记忆是学不好的,还需要通过动手完成实验和不断编程训练,而做好实验和写出好代码则需要很强的逻辑思维和计算能力。不同编程人员对相同问题的分析理解是不一样的,编写出来的代码有时候差别也很大,可能都能解决问题,但是代码的时间复杂度、空间复杂度的差异就可以体现出那段代码的好坏。能写出良好时间、空间复杂度代码的人通常都需要很强的逻辑思维和计算能力,如果这两方面有不足,学习计算机知识会相当吃力。要锻炼自己的逻辑思维和计算能力,则需要把数学学好,如果你想要报考计算机专业,也要评估一下自己的数学成绩和算法理解能力。当然,如果具备上面一、二点中所提到的特质,逻辑思维、计算能力等是可以通过后期学习、锻炼提升的。

四、有比较好的英语成绩。大家也都知道,现在大部分的编程、数据库管理、网络管理工具都是美国的,所使用的语言基本上都是英语,很多技术说明文档也是英语,比较前沿的计算机技术大多也是通过英语发布,如果英语不好、词汇量不足,在学习计算机专业的过程中会遇到不小的困难。所以如果要学好计算机专业知识,也要重视英语成绩的提高。

五、保持持续学习的热情与状态。计算机专业知识的学习不可能一蹴而就,也不可能一劳永逸,从对计算机毫不了解,到对计算机知识大致掌握和应用,再到计算机技术的更新,都需要保持持续的学习热情与状态。现在计算机技术的更新速度非常快,所学到的计算机专业知识可能很快就会落后,只有不断学习并及时更新自己的知识体系才能跟上计算机技术发展的脚步。

那些让孩子学习编程的家长后悔吗?-简书

少儿编程指针对高中以下的孩子所设计的编程学习类产品。用图形化编程语言,把原来英语的代码编程语言转成图形模块化、指令化,以游戏、情景动画、积木构建的形式呈现。

需要在这里说明的是,让儿童学习编程,并不是为了让他们将来都当程序员。少儿编程不同于IT职业教育,它减少了对于编程语言的实际操作的重视,转而更加关注通过编程教育培养孩子们的计算机思维与创造能力,激发孩子内在学习动力以及发展团队合作和沟通等全方位能力。

孩子学编程,并不是为了将来要从事专业的编程工作。从教育角度看,少儿编程的核心的理念是把计算机编程看作与阅读、表达、数学等一样的,小朋友成长所需的基础技能来培养。发达国家对推广编程教育的观点是:编程技能已不仅是信息行业对人才的需求,而将是所有行业的需求。各行各业需要的也不仅是软件专业人才,而是掌握编程技能的行业专业人才。

为什么很多人后悔学计算机,做程序员很开心吗

不是开心的问题,就是一种职业选择,后悔是自己的选择。问起很多人对程序开发这个行业的感受时,很多人经常说的一句话就是:外面的人想进来,里面的人想出去。

选择做程序的人,有些人是觉得他们对程序开发很感兴趣,所以他们去做了这份职业;还有一些人选择做程序员是因为他们觉得程序员的工资很高,如果做程序员,他们就可以在很短的时间里赚很多钱。在有钱以后,他们就可以做自己想做的事情,他们可以实现买房、买车、迎娶白富美、走上人生巅峰的梦想。

不管是为了兴趣,还是为了钱,终归有很多人选择做了程序员。或许很多人在做程序员之前,他们总是把这个职业想象的很美好,但是他当他们真正去做了这份职业以后,他们才发现,高薪的背后其实有太多的心酸和付出。所以从这个角度上来说,程序员其实就是拿着自己的命在换金钱。

有的人在做了一段时间的程序员之后,他们觉得,既然自己已经入了程序员这个行业,既然这个行业的工资还不错,那自己就先好好干吧,趁着自己年轻,趁着自己还能加班熬夜的时候,自己就先多挣点钱,等到以后他们在三四十岁加不动班的时候,等到他们和年轻人拼不起的时候,他们再真正的去做点自己想做的事情。

做程序员需要的技能

1、基本功

这里说的基本功是会程序语言,程序语法,如果你是java程序员,就需要知道java语言语法,如果你是php程序员就需要知道php语言的语法,如果你是c++程序员就需要知道c++语言的语法,因此可以肯定的是学习一门计算机语言也是没问题的。

2、逻辑思维能力

程序中的运算无非就是数值运算和逻辑运算,数值运算无非就是加减乘除,函数,公式什么的,逻辑运算无非就是满足什么条件做什么事情,90%的逻辑都是因为逻辑if、else什么的,在什么情况满足什么条件下做什么事情。还有就是循环逻辑,无非就是做什么,做几次,每次有什么变化,什么时候终止。

⑵ 软件工程师是干什么的

cs201 全栈软件工程师免费下载

链接:https://pan..com/s/1uvC9DjwH3O3qemDwhmO_OA

提取码:djxg

全栈工程师是指掌握多种技能,胜任前端与后端,能利用多种技能独立完成产品的人。

⑶ AD10怎么从原理图生成pcb

在Altium designer软件中,在目标projects中新建一个PCB文件,然后执行更新命令即可。具体操作请参照以下步骤。

1、首先在电脑上打开Altium designer软件,新建一个项目文件(project),然后再新建一个原理图文件。

⑷ 原理图设计基础简介

原理图设计基础简介

《EDA技术》主要介绍EDA技术中最常用的两个工具软件——Protel 2004和Multisim 7。下面是我整理的关于原理图设计基础,欢迎大家参考!

一、 达成目标

l 熟练制作元件库(元件原理图库、元件封装库、元件集成库,包括元件在不同元件库、原理图、PCB板之间的复制)、原理图、PCB板

l 熟练使用各种快捷键

l 熟悉各种设置

二、 重点

l 原理图设计:

Ø 设置图纸

Ø 设置原理图优先设置

Ø 层次电路设计

Ø 元器件自动标注

Ø 编译原理图/项目

Ø 电气检查(电气检查规则、电气连接矩阵)

Ø 添加封装

Ø 检查封装

Ø 生成网表(网表文件)

l 元器件库设计:

Ø 创建元器件库

Ø 创建封装库

Ø 生成集成库

l PCB设计:

Ø 图纸设置

Ø 设置电路板外形尺寸

Ø 层叠管理

Ø 布线规则

Ø 电源划分

Ø 地划分

Ø 走线(等长线、差分线、曲线)

Ø 敷铜

三、 设计流程

l 原理图设计流程

设置图纸——》设置原理图优先设置——》设置电器检查规则(电气检查规则、电气连接矩阵)——》添加元器件——》元器件电气连接——》元器件自动标注——》编译原理图——》查看编译结果,修改错误——》添加元器件封装——》检查元器件封装——》生成网表文件

l 元器件库设计流程

创建元器件库——》编辑元器件——》创建封装库——》编辑元器件封装——》元器件库追加封装——》编译生成元器件集成库

l PCB设计流程

设置PCB设计环境——》PCB布局——》布线规则设置——》自动布线——》手动调整布线——》敷铜——》添加过孔以连接各层的敷铜——》保存

四、 常用快捷键

l 原理图和PCB通用快捷键:

Shift 当自动平移时,快速平移

Y 放置元件时,上下翻转

X 放置元件时,左右翻转

Shift+↑↓←→ 箭头方向以十个网格为增量,移动光标

↑↓←→ 箭头方向以一个网格为增量,移动光标

SpaceBar 放弃屏幕刷新

Esc 退出当前命令

End 屏幕刷新

Home 以光标为中心刷新屏幕

Ctrl+Home 将偏离图纸的元件自动调整到工作原点

PageDown,Ctrl+鼠标滚轮 以光标为中心缩小画面

PageUp,Ctrl+鼠标滚轮 以光标为中心防大画面

鼠标滚轮 上下移动画面

Shift+鼠标滚轮 左右移动画面

V+D 显示整个文档

V+F 显示所有对象

X+A 取消所有选中的对象

单击并按住鼠标右键 显示滑动小手并移动画面

点击鼠标左键 选择对象

点击鼠标右键 显示弹出菜单,或取消当前命令

右击鼠标并选择Find Similar 选择相同对象

点击鼠标左键并按住拖动 选择区域内部对象

点击并按住鼠标左键 选择光标所在的对象并移动

双击鼠标左键 编辑对象

Shift+点击鼠标左键 选择或取消选择

TAB 编辑正在放置对象的属性

Shift+C 清除当前过滤的对象

Shift+F 可选择与之相同的对象

Y 弹出快速查询菜单

F11 打开或关闭Inspector面板

F12 打开或关闭List面板

Ctrl+Shift+L 左对齐

Ctrl+Shift+R 右对齐

Ctrl+Shift+H 中对齐

Ctrl+T 顶部对齐

Ctrl+B 地步对齐

l 原理图快捷键:

Alt 在水平和垂直线上限制对象移动

G 循环切换捕捉网格设置

SpaceBar 放置对象时旋转90度

SpaceBar 放置电线、总线、多边形线时激活开始/结束模式

Shift+SpaceBar 放置电线、总线、多边形线时切换放置模式

BackSpace 放置电线、总线、多边形线时删除最后一个拐角

点击并按住鼠标左键+Delete 删除所选中线的拐角

点击并按住鼠标左键+Insert 在选中的线处增加拐角

Ctrl+点击并拖动鼠标左键 拖动选中的对象

l PCB快捷键:

Shift+R 切换三种布线模式

Shift+E 打开或关闭电气网格

Ctrl+G 弹出捕获网格对话框

G 弹出捕获网格菜单

N 移动元件时隐藏网状线

L 镜像元件到另一布局层(拖动元件时)

BackSpace 在布铜线时删除最后一个拐角

Shift+SpaceBar 在布铜线时切换拐角模式

SpaceBar 布铜线时改变开始/结束模式

Shift+S 切换打开/关闭单层显示模式

O+D+D+Enter 选择草图显示模式

O+D+F+Enter 选择正常显示模式

O+D 显示/隐藏Prefences对话框

L 显示Board Layers对话框

Ctrl+H 选择连接铜线

Ctrl+Shift+Left-Click 打断线

+ 切换到下一层(数字键盘)

- 切换到上一层(数字键盘)

* 下一布线层(数字键盘)

M+V 移动分割平面层顶点

Alt 避开障碍物和忽略障碍物之间切换

Ctrl 布线时临时不显示电气网格

Ctrl+M 测量距离

Shift+ SpaceBar 顺时针旋转移动的对象

SpaceBar 逆时针旋转移动的对象

Q 米制和英制之间的单位切

l 高频率使用的快捷键

TAB 选中元件后,可以显示该元件的属性

PAGEUP 以鼠标所在点为中心,放大视图

PAGEDOWN 以鼠标所在点为中心,缩小视图

HOME 居中,可以从原来光标下的图纸位置,移位到工作区中心位置显示

END 更新绘图区的图形

四个方向键 用于逐步往各个方向移动

F+U 打印设置

F+P 打开打印机

F+N 新建文件

F+O 打开文件

F+S 保存文件

F+V 打印预览

E+U 取消上一步操作

E+F 查找

E+S 选择

E+D 删除

E+G 对齐

E+G+L 左对齐

V+D 显示整个图形区域

V+F 显示所有元件

V+A 区域放大

V+E 放大选中的元件

V+P 以鼠标单击点为中心进行放大

V+O 缩小

V+5,1,2,4 放在50%,10%,200%,400%

V+N 将鼠标所在点移动到中心

V+R 更新视图

V+T 工具栏选择

V+W 工作区面板选择

V+G 网格选项

C 在视图区打开工程快捷菜单

P+B 放置总线

P+U 放置总线接口

P+P 放置元件

P+J 放置接点

P+O 放置电源

P+W 连线

P+N 放置网络编号

P+R 放置IO口

P+T 放置文字

P+D 绘图工具栏

D+B 浏览库

D+L 增加/删除库

D+M 制作库

T 打开工具菜单

R 打开报告菜单

W 打开窗口菜单

五、 其他

l 对象整体编辑

选元件——》查找相似对象——》编辑选项(如current footprint(same)选取了所有相同的封装,取消“运行检查器”选项)——》按住shift鼠标单击选中收索结果元件——》按住f11弹出inspector对话框,在current footprint选中封装修改之——》保存退出

l 制作元器件库时顺便加载封装

制作原理图元器件时顺便将pcb对应的库文件加载,保证引脚一一对应(pin maps),然后对元件进行规则检查

l 更改已存在的原理图元件库

以工程文件形式打开元件库——》ctrl+a——》ctrl+c——》新建原理库文件ctrl+v——》修改引脚——》修改元件属性——》重命名——》建在footprint pcb库封装——》编辑引脚图——》保存退出

队列粘贴可用在复制大量属性一致的.引脚上

l 从已有的pcb项目中把原件库还原出来

打开pcb——》执行design——》make pcb library

l 从已有的sch原理图项目中把原件库还原出来

打开.sch文件——》执行design——》make project library

六、 绘制PCB的几个要点

l 布线顺序

先信号线,后电源地线

l 走线

Ø 蛇形线

P——》T: 布线

Shift+A: 切换成蛇形走线

`: 显示当前可用操作

1、2、3、4: 改变蛇形走线弧度

,。: 改变蛇形走线振幅

Tab: 设置走线类型(曲线、折线)

Ø 曲线

Ctrl+Shift+Space

Ø 等长线(走线完成后设置等长)

新建类:Design——》Classes,右键Net Class——》Add Class,右键重命名

添加网络:向内里面添加需要等长的网络

设置线路等长:T+R——》点击某条需要修改的线路——》Tab设置等长线参数——》点击“确定”,鼠标沿线路移动,直到长度达到要求

Ø 差分线

原理图中添加差分线(添加差分线标志,差分线组网络标签结尾为_p、_N),将差分线规则导入PCB板(直接update即可)——》PCB文件中打开PCB面板,在PCB面板选择Differential Pairs,在下面的框中选择All Differential Pairs,这样所有的差分对就在Designer框中出现了——》选中一对差分对,点击Rule Wizard,进入Differential Pairs Wizard界面,设置差分对规则——》Place——》Differential Paris Routing开始布线,差分线布线时,两根差分线会同时布线

Ø 等长蛇形差分线

Tool——》Interactive Diff Pair Length Tunning,调整方法与等长线一样

l 敷铜

Ø 矩形填充

Ø 多边形敷铜

Ø 多边形填充挖空

Ø 切断多边形填充区

;

⑸ 急(高悬赏 帮个忙) 求编译原理课程设计---c语言实现c-的语法分析,在线等

新建一个文本文档在你工程目录下,名字起为"输入.txt",里面的内容可以为
begin a:=1+7*(6+3);b:=1end#

输出是在"输出.txt"中查看,以下为输出情况:

词法分析结果如下:
(1, begin)
(10, a)
(18, :=)
(11, 1)
(13, +)
(11, 7)
(15, *)
(27, ()
(11, 6)
(13, +)
(11, 3)
(28, ))
(26, ;)
(10, b)
(18, :=)
(11, 1)
(6, end)
(0, #)
语法分析结果如下:(以四元式形式输出)
( +, 6, 3, t1)

( *, 7, t1, t2)

( +, 1, t2, t3)

( =, t3, __, a)

( =, 1, __, b)

//提供一个编译原理的语义分析程序 你可以直接复制 用TC进行调试
#include "stdio.h"
#include "string.h"
#include <malloc.h>
#include <conio.h>
#include "stdlib.h"

char prog[100],token[8],ch;
char *rwtab[6]={"begin","if","then","while","do","end"};
int syn,p,m,n,sum,q;
int kk;
//四元式表的结构如下:
struct
{
char result1[8];
char ag11[8];
char op1[8];
char ag21[8];
}quad[20];

char *factor();
char *expression();
int yucu();
char *term();
int statement();
int lrparser();
char *newtemp();
void scaner();
void emit(char *result,char *ag1,char *op,char *ag2);

void main()
{
FILE *fp1,*fp2;

if((fp1=fopen("输入.txt","rt"))==NULL)
{
printf("Cannot open 输入.txt\n");
getch();
exit(1);
}
if((fp2=fopen("输出.txt","wt+"))==NULL)
{
printf("Cannot create 输出.txt FILE.strike any key exit");
getch();
exit(1);
}

int j;
q=p=kk=0;
p=0;
//printf("Please Input a String(end with '#'):\n");
while(ch!='#')
{
ch = fgetc(fp1);
if(ch == EOF)
{
printf("文件为空,请检查后再尝试!");
return ;
}

prog[p++]=ch;
}
if(prog[p]=='#')
{
printf("输入的待分析的串不是以'#'结尾,请修改之后再尝试!\n");
return;
}
p=0;
char buffer1[200] = {0};
sprintf(buffer1,"词法分析结果如下:\n");
fputs(buffer1,fp2);
//printf("词法分析结果如下:\n");
do
{
scaner();
switch(syn)
{
case 11:
//printf("(%d,%d)\n",syn,sum);
sprintf(buffer1,"(%d, %d) \n",syn,sum);
fputs(buffer1,fp2);
break;
default:
//printf("(%d,%s)\n",syn,token);
sprintf(buffer1,"(%d, %s)\n",syn,token);
fputs(buffer1,fp2);
break;
}
}while(syn!=0);
printf("\n");

p=0;
char buffer[200]={0};
sprintf(buffer,"语法分析结果如下:(以四元式形式输出)\n");
fputs(buffer,fp2);
//printf("语法分析结果如下:(以四元式形式输出)\n");
scaner();//扫描函数
lrparser();
if(q>19)
printf(" to long sentense!\n");
else
{

for (j=0;j<q;j++)
{
//printf("( %s, %s, %s, %s) \n\n",quad[j].op1,quad[j].ag11,quad[j].ag21,quad[j].result1);
sprintf(buffer,"( %s, %s, %s, %s) \n\n",quad[j].op1,quad[j].ag11,quad[j].ag21,quad[j].result1);
fputs(buffer,fp2);
}
}
printf("已把相应的词法和语法的结果保存到相应的文件中,请查阅!\n");
fclose(fp1);
fclose(fp2);
}
int lrparser()
{
int schain=0;
kk=0;
if (syn==1) //得到begin
{
scaner();//扫描下个字符
schain=yucu();
if(syn==6)//得到end
{
scaner();//扫描下个字符
if((syn==0)&&(kk==0)) //得到#
printf("Success!\n");
}
else
{
if(kk!=1)
printf("short of 'end' !\n");
kk=1;
getch();
exit(0);
}
}
else
{
printf("short of 'begin' !\n");
kk=1;
getch();
exit(0);
}
return (schain);
}
int yucu()
{
int schain=0;
schain=statement();
while(syn==26)
{
scaner();
schain=statement();
}
return (schain);
}
int statement()
{
char tt[8],eplace[8];
int schain=0;
if (syn==10)
{
strcpy(tt,token); //tt中保存的是第一个字符
scaner();
if(syn==18) //检测到=号
{
scaner();
strcpy(eplace,expression());
emit(tt,eplace,"=","__");
schain=0;
}
else
{
printf("short of sign ':=' !\n");
kk=1;
getch();
exit(0);
}
return (schain);
}
}
char *expression()
{
char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt=(char *)malloc(12);

strcpy(eplace,term());

while((syn==13)||(syn==14))
{
if (syn==13)
strcpy(tt,"+");
else
strcpy(tt,"-");

scaner();
strcpy(ep2,term());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return (eplace);
}
char *term()
{
char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt=(char *)malloc(12);

strcpy(eplace,factor());

while((syn==15)||(syn==16))
{
if (syn==15)
strcpy(tt,"*");
else
strcpy(tt,"/");
scaner();
strcpy(ep2,factor());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return (eplace);
}
char *factor()
{
char *fplace;
fplace=(char *)malloc(12);
strcpy(fplace,"");

if(syn==10) //得到字符
{
strcpy(fplace,token);
scaner();
}
else if(syn==11) //得到数字
{
itoa(sum,fplace,10);
scaner();
}
else if(syn==27) //得到)
{
scaner();
fplace=expression();
if(syn==28) //得到(
scaner();
else
{
printf("error on ')' !\n");
kk=1;
getch();
exit(0);
}
}
else
{
printf("error on '(' !\n");
kk=1;
getch();
exit(0);
}
return (fplace);
}
//该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2...
char *newtemp()
{
char *p;
char m[8];
p=(char *)malloc(8);

kk++;
itoa(kk,m,10);
strcpy(p+1,m);
p[0]='t';
return(p); //设置中间变量名放在一个字符数组中,字符数组的第一个字符为t第二个字符为m表示的数值
}
void scaner()
{
sum=0;
///for(m=0;m<8;m++)
//token[m++]=NULL;
memset(token,0,8);
m=0;
ch=prog[p++];
while(ch==' ')
ch=prog[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{
while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{
token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
token[m++]='\0';
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else if((ch>='0')&&(ch<='9'))
{
while((ch>='0')&&(ch<='9'))
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
else switch(ch)
{
case '<':m=0;
ch=prog[p++];
if(ch=='>')
{
syn=21;
}
else if(ch=='=')
{
syn=22;
}
else
{
syn=20;
p--;
}
break;
case '>':m=0;
ch=prog[p++];
if(ch=='=')
{
syn=24;
}
else
{
syn=23;
p--;
}
break;
case ':':m=0;
token[m++] = ch;
ch=prog[p++];
if(ch=='=')
{
syn=18;
token[m++] = ch;
}
else
{
syn=17;
p--;
}
break;

case '+': syn=13;token[0] = ch; break;
case '-': syn=14;token[0] = ch; break;
case '*': syn=15;token[0] = ch;break;
case '/': syn=16;token[0] = ch;break;
case '(': syn=27;token[0] = ch;break;
case ')': syn=28;token[0] = ch;break;
case '=': syn=25;token[0] = ch;break;
case ';': syn=26;token[0] = ch;break;
case '#': syn=0;token[0] = ch;break;
default: syn=-1;break;
}
}
//该函数是生成一个三地址语句送到四元式表中
void emit(char *result,char *ag1,char *op,char *ag2)
{
strcpy(quad[q].result1,result);
strcpy(quad[q].ag11,ag1);
strcpy(quad[q].op1,op);
strcpy(quad[q].ag21,ag2);
q++; //统计有多少个四元式
}

热点内容
安卓篮球手游在哪里下 发布:2025-02-10 23:21:55 浏览:133
linux改变所有者 发布:2025-02-10 23:04:13 浏览:650
源码曹毅 发布:2025-02-10 23:04:01 浏览:582
odbcforsqlserver 发布:2025-02-10 22:26:37 浏览:600
区块链数据存储在那里 发布:2025-02-10 22:25:48 浏览:689
c语言for死循环 发布:2025-02-10 22:24:08 浏览:523
苹果限制访问初始密码 发布:2025-02-10 22:21:31 浏览:759
为什么安卓手机一年后卡顿 发布:2025-02-10 22:15:39 浏览:732
职工信息管理系统设计c语言 发布:2025-02-10 22:15:30 浏览:119
预算法的理念 发布:2025-02-10 22:15:25 浏览:133