如何将EXCEL表导入程序符号表

如何将EXCEL表导入程序符号表,第1张

你将做好的excel文件后缀xls改成dif,在符号表编辑器里打开“导入”,选择你编好的excel文件就可以了。你在符号表编辑器里点击“导出”,选择文件格式为excel文件格式,看看你导出的文件,你就明白为什么是dif格式了。

Symbol Tables

为了维持静态作用域的程序里各个名字的轨迹,编译器需要依靠一种称为符号表的数据结构。从最基本的层次上看,符号表就是一个字典:它把名字映射到编译器已知的有关信息。这里最基本的 *** 作是把一个新映射关系(名字对象约束)放入表里,以及(非破坏性的)用一个给定名字去提取映射下的信息,以后我们把

这两个 *** 作分别称为insert和lookup。大部分语言里的静态作用域规则还提出了另外的复杂性,它们要求在程序里的不同部分有不同的引用环境。为了处理作用域规则,我们可能希望简单增加一个remove *** 作。由于编译器在语义分析阶段要从头到尾扫描代码,这样它就可以在某个作用域开始时插入新约束,在作用域最后撤销它们。但是,存在一些因素使这种直接做法并不实际。

¨ 在许多有着嵌套作用域的语言里,内层声明的效果可以遮蔽外层声明,这就意味着符号表必须有能力为一个给定名字保存任意数目的映射。lookup *** 作必须返回最内层的映射,到作用域结束时还必须使外层映射重新变成可见的。

¨ 类Algol语言里的记录(结构)具有某种作用域性质,但却又不享有作用域那样的良好嵌套结构。当语义分析器看到一个记录声明时,它就必须记下各个记录域的名字(它们也是递归的,因为记录可以嵌套)。在这种声明结束时,各个域的名字又必须变成不可见的。然而,在此之后,一旦这一记录类型的某个变量出现在程序的正文里(例如在my_rec.field_name),在引用中位于圆点之后的部分,这些域名又必须立即重新变成可见的。在Pascal和另一些有with语句的语言里,记录域的名字还应该在多个语句的上下文里变成可见的。

¨ 某些时候一些名字有可能在它们被声明之前使用,即使在类Algol语言里情况也如此。举例说,Algol 60和Algol 68都允许标号的向前引用。Pascal避免了这种情况,它要求标号必须在作用域开始处声明,但还是允许指针声明的向前引用:

type

company = record

CEO : ^person (* forward reference *)

...

end

person = record

employer : ^company

...

end

¨ Pascal和其他语言都允许子程序的向前声明,以便支持相互递归:

procedure Q (A, B : integer)forward

procedure P (A, B : integer)

begin

...

Q (3, 4)

...

end

procedure Q (* parameters are not repeated in Pascal *)

begin

...

P (4, 5)

...

end

在看到这段代码里的向前声明时,语义分析器必须记住Q的参数,以便后面可以在Q的体里使它们重新变成可见的,但在此期间又必须使它们成为不可见的。这种 *** 作类似于记住记录域的名字。

¨ 虽然我们有可能希望在作用域结束时忘记有关的名字,甚至回收这些名字在符号表里占据的空间,但有关它们的信息仍需要保存起来,以便符号纠错系统(symbolic debugger)使用。这种纠错系统是非常有用的工具,用户可以借助它方便地 *** 纵程序,如启动程序,停住它,读出或者修改程序里的数据等等。为了分析来自用户的高级名字(例如,要求打印出my_firm^.revenues[1999] 的值),符号纠错程序必须能访问编译器的符号表。为了使符号表在运行时也可以用,编译器通常会把这个表保存到最后的机器语言程序里的某个隐蔽的部分。

静态作用域的大部分变化都可以通过扩充基本符号表的方式处理,通过增加一对enter_scope和leave_scope *** 作维持可见性的轨迹。任何东西都不会从符号表里删除,在整个编译阶段所有的结构都保留着,最后还要为纠错系统使用而保存起来。带有可见性处理的符号表可以以多种不同方式实现,下面描述的方式归功于LeBlanc和Cook [CL83]。

在遇到每个作用域时赋给它一个序列号。给定最外层的作用域(其中包含着预定义的标识符)编号0,包含用户定义全局名字的作用域给以编号1。其他作用域按遇到它们的顺序进行编号。所有的编号互不相同,它们并不表示词法嵌套的层次,但也有一点,嵌套于内部的子程序的编号自然会大于它们的外围作用域的编号。

所有的名字都被放入一个大的散列表里,以名字作为关键码,无论其作用域如何。表里的每项都包含一个符号名,其类属(变量、常量、类型、过程、域名字、参数等等),作用域编号,类型(一个指向另一符号表项的指针),以及另一些特定类属所拥有的信息。

除了这一散列表之外,符号表还包含一个作用域堆栈,它按顺序指明组成当前引用环境的所有作用域。在语义分析器扫描程序的过程中,在进入或退出程序时分别压入或者d出这个堆栈。作用域堆栈的项里包含着作用域编号,指明这一作用域是否为闭的,有些情况下还可以有另外一些信息。

图3.13 LeBlanc-Cook符号表的lookup算法。

当需要到表里查找名字时,我们会顺着某个适当的散列表链向下找,这样就会找到要找的名字所对应的一些项。对于每个匹配项,我们都向下扫描作用域堆栈,看看这个项所在的作用域是否可见。这种堆栈查看的深度不应超过最上面的闭作用域。要把导入项和导出项变为在它们的作用域之外可见的,方法就是在表里建立另外的项,让这些项里包含着指向实际项的指针。对于所有带有作用域编号0的项,我们都不需要去检查作用域堆栈,因为它们是渗透性的。图3.13里是lookup算法的伪代码。

图3.14的右下角是一个Modula-2程序的梗概,图中其余部分展现的是在过程P2里with语句处的引用环境的符号表配置情况。作用域堆栈里包含4个项,分别表示那个with语句,过程P2,模块M和全局作用域。with语句的作用域指明了在这一特定作用域里的(域)名字属于哪个记录变量。最外面的渗透性作用域没有显式表示。

图3.14 一个Modula-2例子程序的LeBlanc-Cook符号表。作用域堆栈表示在过程P2里with语句的引用环境。为清楚起见,许多指向符号表里对应于integer和real的项都用带括号的 (1) 和 (2) 表示,没有画出箭头。

因为这里的散列表以名字作为关键码,特定名字的所有项都出现在同一个散列链里。在这个例子里,散列冲突导致A2、F2和T出现在同一个链里。变量V和I(M的I)有另外的项,使它们跨过闭作用域M的边界后仍为可见的。当我们处于P2里时,对于I的查找 *** 作将找到P2的I,M的I里的两个项都不可见。类型T的项指明了在with语句期间放入作用域堆栈的作用域编号。每个子程序的项里包含了一个头指针,指向子程序参数的链接表,以便做调用分析时使用(图中没有给出这些链的一些链接)。在代码生成过程中,许多符号表项还可能包含另外的域,表示例如对象大小和运行时地址等等信息。

图片信息,看参考资料。。。

符号表的用途在于给IO变量或数据定义一个名称,方便在编写程序及阅读程序的时候理解其含义。比如I0.0,定义为P0101_RUN,注释为提升泵运行信号,可以按自己熟悉的命名格式。其导入导出可以用EXCEL或其他工具快速定义符号。

变量表是用来监控相应变量在线状态的,可以根据不同的调试要求,生成多个变量表。变量表是不会下载到PLC里面的。

举个最简单的例子吧,控制一个阀门打开及关闭,有几个条件:I0.0 集中,I0.1打开,I0.2关闭,I0.3开到位,I0.4关到位,I0.5故障(比如过力距),Q0.0打开输出,Q0.1关闭输出。

扩展资料:

美国汽车工业生产技术要求的发展促进了PLC的产生,20世纪60年代,美国通用汽车公司在对工厂生产线调整时,发现继电器、接触器控制系统修改难、体积大、噪声大、维护不方便以及可靠性差,于是提出了著名的“通用十条”招标指标。

1969年,美国数字化设备公司研制出第一台可编程控制器(PDP-14),在通用汽车公司的生产线上试用后,效果显著;

1971年,日本研制出第一台可编程控制器(DCS-8);1973年,德国研制出第一台可编程控制器;1974年,我国开始研制可编程控制器:1977年,我国在工业应用领域推广PLC。

最初的目的是替代机械开关装置(继电模块)。然而,自从1968年以来,PLC的功能逐渐代替了继电器控制板,现代PLC具有更多的功能。其用途从单一过程控制延伸到整个制造系统的控制和监测。

参考资料来源:百度百科-可编程逻辑控制器


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7754990.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存