2.2 指令表编译器的设计与实现
实现对PLC编程语言的高效、可靠的编译,是研制开发嵌入式PLC系统的一项关键性任务。传统的开发方法是用高级语言自行开发专用的PLC指令编译器,需要对每个程序字和程序规则编写识别和相应的处理程序,工作量大、开发周期长,容易产生疏漏,可维护性很差。为了提高软件的开发效率,保证软件质量,增强软件的可维护性,采用通用编译工具Lex8LYacc开发PLC指令编译器。
2.2.1 Lex&Yacc简介
Lex 8L Yacc是美国贝尔实验室用C语言研制的词法分析程序和语法分析程序的自动生成工具,是目前使用最广泛的编译软件之一。Lex是词法分析程序生成器,Yacc是语法分析程序生成器。它们可以根据用户提供的词法、语法规范文件,自动转化为多种高级语言源代码,如C或C++等。
2.2.2 编译器总体结构
所谓“遍”,是对源程序或其等价的中间语言程序从头到尾扫描并完成规定任务的过程。本系统的编译过程包含三遍,分别进行词法分析、语法分析和代码转换。
2.2.3 词法分析器设计
指令表源程序可以简单地被看成一个多行的字符串。词法分析器从上到下、从左到右逐个字符地对源程序进行扫描,产生一个个单词符号,把字符串的源程序改造成为单词符号串的中间程序,用于随后的语法分析。
本系统的词法分析器有两种工作状态:一是从头到尾对源程序进行扫描,检查出所有的词法错误;二是当没有词法错误时,从头到尾对源程序进行扫描,将识别出的单词符号输入给语法器。
2.2.4 语法分析器设计
(1)PLC指令表语言的语法描述
分析PLC指令程序结构,提取隐藏在指令代码中的结构信息,这种信息中往往会有操作指令被隐含地表达出来。例如:指令OR/0RB与梯形图中的并联结构对应,而AND/ANB则与梯形图中的串联结构对应。