CN103019801B - 一种应用于高速数字io波形引擎的编译器 - Google Patents
一种应用于高速数字io波形引擎的编译器 Download PDFInfo
- Publication number
- CN103019801B CN103019801B CN201210560608.0A CN201210560608A CN103019801B CN 103019801 B CN103019801 B CN 103019801B CN 201210560608 A CN201210560608 A CN 201210560608A CN 103019801 B CN103019801 B CN 103019801B
- Authority
- CN
- China
- Prior art keywords
- parameter
- node
- chained list
- key word
- code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种应用于高速数字IO波形引擎的小型编译器,其处理分为三步,关键字和变量的识别及分类处理,语法检查和代码优化,目标代码生成。在第一步中,采用链表的形式记录关键字和特殊符号的出现顺序,关键字的参数记录在数组中,第二步将数组转换为链表,减小空间占用;最后一步根据链表出栈,生成目标码。本发明能够简化编译过程,减小编译器大小,在编译过程中使用资源可灵活申请,不会浪费,且该编译器能够设置在下位机中,免去了上位机编译下载过程,减少开销和调试时间。
Description
技术领域
本发明属于软件编译算法领域,特别涉及一种应用于高速数字IO波形引擎的小型编译器。
背景技术
在传统意义上,仪器厂商为用户提供控制程序或者驱动程序都以函数和属性为单位,这些函数和属性都偏重于实现某一项或几项特定功能,用户仅可固定使用厂商提供的控制方式而不能将更底层的功能按照自己的需求任意组合,这样就对用户的使用方式做出了限制,无法满足用户更高层次的需求。例如,用户需要使用高速数字IO模块提供的原有函数实现多个波形带有多个marker标记,同时满足多个触发条件,还要实现N层循环嵌套和条件分支,这几乎是不可能实现的。本申请人于2011年12月20日提出了一项专利申请“一种用于任意波形产生系统的处理器”(申请号为201110430689.8),该申请提供了一种精简指令集的高速数字IO波形引擎,该引擎只采用Generate、Repeat/endRepeat、If/endIf、Wait、Clear这几条简单的指令即可覆盖波形引擎的绝大部分功能需求。
在采用上述精简指令集进行程序代码编写完成后,需要对程序代码进行编译,从而转化为二进制目标码。一般编译过程分为词法分析,语法分析,语法制导翻译,中间码生成,存储管理,代码优化和目标代码生成过程。而且由于编译器比较复杂,因此编译过程通常是在上位机上完成的,编译完成后将目标码下载到下位机运行。
传统编译方法所面临的问题:
1、执行这些步骤的过程中,会生成堆栈,链表,二叉树等结构变量,需要大量内存空间来存储这些变量,这些资源大多需要预先申请,用户编写代码过长过短都会造成空间浪费。
2、需要通过上位机完成程序编译之后才能通过总线发送到下位机执行,是因为上述过程对速度和空间的要求较高,下位机一般无法提供上述步骤所需要的足够的资源完成编译过程。
3、传统编译过程的环节比较多,且是顺序执行的关系,下一个步骤的输入依赖于上一个步骤的输出,如果上一个步骤的结果不符合语法定义的规则,下一个步骤将不能正常执行,这时候环境将会停止编译并报错返回。这样繁冗的操作是为了整个IDE环境的稳定,但是对于用户来讲相当于增加了诸多的限制,而且越往后面的步骤报错之后用户越是无法干预,甚至迷惑不解。
发明内容
有鉴于此,本发明提供了一种应用于高速数字IO波形引擎的小型编译器,能够简化编译过程,减小编译器大小,在编译过程中使用资源可灵活申请,不会浪费,且该编译器能够设置在下位机中,免去了上位机编译下载过程,减少开销和调试时间。
为了解决上述技术问题,本发明是这样实现的:
一种应用于高速数字IO波形引擎的小型编译器,该编译器包括第一模块、第二模块和第三模块;
第一模块,用于关键字和变量的识别及分类处理;具体为:读取待编译程序,进行逐字处理;
如果当前读取到的为关键字,则按照预先设定的关键字使用规则,先对关键字的前后词句进行检查,看其是否符合语法定义;如果不符合,则停止编译并返回相应错误码;如果符合,则将当前关键字对应的出现次数变量加1,并且在顺序链表L0的尾部增加一个结点,将当前关键字的代码添加到尾部结点中;如果当前关键字具有参数,则将参数记录到第一参数数组,并在当前关键字的链表结点中记录参数在第一参数数组中的索引;
如果当前读取到的为特殊符号,包括begin、end、小括号、大括号、双引号、分号,则将当前特殊符号对应的出现次数变量加1,并且在顺序链表L0的尾部增加一个结点,将当前特殊符号的代码添加到尾部结点中;
第二模块,用于语法检查和代码优化;具体为:
所述语法检查包括:检验关键字和特殊符号对应的出现次数变量的值是否与顺序链表L0中相应关键字和特殊符号出现次数相同;根据顺序链表L0中具有配对关系的特殊符号的出现次数和位置检验配对关系是否正常;如果语法检查有错误,则停止编译并返回相应错误码;
所述代码优化为:将所述第一参数数组中的元素转化为参数链表中的结点,采用参数链表结点地址代替顺序链表L0中的第一参数数组索引;释放第一参数数组空间;
第三模块,用于实现目标代码生成;具体为:
逐个访问顺序链表L0中的每个结点,如果当前结点为关键字且没有参数,则直接根据目标码生成规则生成目标码,如果当前结点为关键字且有参数,则根据结点中记录的参数链表结点地址,从参数链表中提取参数,将关键字与参数组合后根据目标码生成规则生成目标码;如果当前结点为特殊符号,则直接根据目标码生成规则生成目标码。
优选地,所述第一模块进一步用于,如果关键字跟随的参数为triggern,则只将n的值存储到第二参数数组中;步骤三目标代码生成时,如果当前结点为关键字且参数n从第二参数数组中提取,则为提取的n加上trigger的前缀,然后再生成目标码。
有益效果:
1、本发明采用链表形式记录关键字,并且将变量的记录形式也转化为链表,这样可以灵活申请空间,减少编译过程中的空间利用。编译过程中会根据变量长度灵活申请空间并及时释放,生成的堆栈长度随结构增减,最大化减少编译过程中空间的申请。
2、本发明的编译器所用资源较少,用户可将写好的代码放入下位机直接进行编译执行,免去上位机编译下载过程,减少硬件开销和调试时间。因此本发明可应用于板载SOC,免去交叉编译过程。
3、本发明将原有的7项过程统编为2个阶段,提高编译效率,降低过程之间依赖性,检查报错功能融入到整个过程,可准确定位错误。
附图说明
图1为本发明流程图。
图2为顺序链表和参数数组的示意图。
具体实施方式
下面结合附图并举实施例,对本发明进行详细描述。
本发明提供了一种高速数字IO波形引擎的小型编译器,其包括三个模块,第一模块、第二模块和第三模块分别执行如下步骤一、二、三。
图1是本发明流程图。
步骤一、第一模块进行关键字和变量的识别及分类处理。
如图1所示,用户代码作为输入数据进入编译器,编译器会对代码进行预编译处理,这一阶段主要是检查语法错误,关键字识别,简单的存储等,为后续过程做准备,如果有错误会返回相应的十六位错误码,对照提供的文档可查出对应的错误。具体执行过程如下:
步骤11、读取待编译程序,进行逐字处理;如果当前读取到的为关键字,则执行步骤12;如果当前读取到的为特殊符号,包括begin、end、小括号、大括号、双引号、分号,则执行步骤13。
其中,读取待编译程序的方式可以为参数方式和文件方式。文件方式是指用户已经编辑好的外部文件,使用的时候调用使用文件读取的函数将文件内容读入;参数方式是指将编辑好的程序保存在库文件中,通过在库文件中打开函数的参数形式引入待编译程序。读入过程使用简单的C语言函数即可实现。
为节省整个编译过程的执行时间,在读入文件的时候,编译器会同时进行关键字和特殊符号的识别并进行分类处理。关键字为高速数字IO波形引擎中精简指令集中的指令,包括Generate,Repeat/endRepeat、If/else/endIf,Wait,Clear。特殊符号包括begin、end、小括号、大括号、双引号、分号(作为一条语句的结束符,用法同C语言)。
步骤12、按照预先设定的关键字使用规则,先对关键字的前后词句进行检查,看其是否符合语法定义;如果不符合,则停止编译并返回相应错误码;如果符合,则将当前关键字对应的出现次数变量加1,并且在顺序链表L0的尾部增加一个结点,将当前关键字的代码添加到尾部结点中;如果当前关键字具有参数,该参数可以为变量,可以为常量,则将参数的信息记录到参数数组,并在当前关键字的链表结点中记录参数在参数数组中的索引;当然,链表结点中还会有下一个节点的指向信息。
以下面这段代码为例,第一个词为Generate,是关键字,检查该关键字后面是否为波形名,如果不是,则返回错误代码例如22,如果是,则将该关键字的代码0411添加在如图2所示的顺序链表L0的第一个结点中,并且将Generate对应的次数变量G加1,而且,Generate具有参数wave1,则将该wave1存储到参数数组的第一个元素中,将该元素的索引[1]记录到顺序链表L0的第一个结点。对于Repeat10,与Generatewave1类似,只是存储在参数数组中的不是变量名,而是10。对于“endrepeat”和“endif”,会认为其属于关键字,按照没有参数的关键字进行处理。在实际实现中,编译器在遇到end时会检查其后续单词,如果是需要配对的关键字,如“endrepeat,endif”这两个单词,会将“endrepeat”、“endif”作为一个整体关键字进行处理,其他end均会按照特殊符号处理。
步骤13:将当前特殊符号对应的出现次数变量加1,并且在顺序链表L0的尾部增加一个结点,将当前特殊符号的代码添加到尾部结点中。
本步骤一的过程只提供简单的语法检查功能,并不能发现深层次的语法和逻辑错误,如检查括号是否配对等。
这个过程相当于把传统编译过程的词法分析,语法分析,语法制导翻译和存储管理的部分功能结合为一个过程,简化中间处理,在处理数据的过程中进代码检查,提高编译效率。
步骤二、第二模块进行语法检查和代码优化。
第二阶段去除了传统编译过程的中间代码生成阶段,结合语法检查和代码优化直接进行目标代码生成,如果有错误出现则返回相应错误码。具体为:
所述语法检查包括:检验关键字和特殊符号对应的出现次数变量的值是否与顺序链表L0中相应关键字和特殊符号出现次数相同;根据顺序链表L0中具有配对关系的特殊符号的出现次数和位置检验配对关系是否正常,包括beginend的配对关系、{}的配对,()的配对等;如果语法检查有错误,则停止编译并返回相应错误码。
所述代码优化为:将所述参数数组中的元素转化为参数链表中的结点,采用参数链表结点地址代替顺序链表L0中的参数变量索引,释放参数数组空间,从而实现压缩空间存储。由于编译前不知道程序中有多少个变量,也不知道变量长度,因此需要预先申请比较大的数组,本发明在第二阶段中,将数组转化为链表,并释放数组空间,从而实现了空间压缩。
步骤三、第三模块实现目标代码生成;
逐个访问顺序链表L0中的每个结点,如果当前结点为关键字且没有参数,则直接根据目标码生成规则生成目标码,如果当前结点为关键字且有参数,则根据结点中记录的参数链表结点地址,从参数链表中提取参数,将关键字与参数组合后根据目标码生成规则生成目标码;如果当前结点为特殊符号,则直接根据目标码生成规则生成目标码。
至此,本流程结束。
为了进一步节省存储空间,在步骤12中,如果关键字跟随的变量为triggern,则只将n的值存储到第二参数数组中;步骤三目标代码生成时,如果当前结点为关键字且参数n从第二参数数组中提取,则为提取的n加上trigger的前缀,然后再生成目标码。前面步骤中所述的参数数组与这里的第二参数数组是两个数组,通过数组名可以实现区分。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (2)
1.一种应用于高速数字IO波形引擎的小型编译器,其特征在于,将该编译器设置在下位机中;该编译器包括第一模块、第二模块和第三模块;
第一模块,用于关键字和变量的识别及分类处理;具体为:
读取待编译程序,进行逐字处理;
如果当前读取到的为关键字,则按照预先设定的关键字使用规则,先对关键字的前后词句进行检查,看其是否符合语法定义;如果不符合,则停止编译并返回相应错误码;如果符合,则将当前关键字对应的出现次数变量加1,并且在顺序链表L0的尾部增加一个结点,将当前关键字的代码添加到尾部结点中;如果当前关键字具有参数,则将参数记录到第一参数数组,并在当前关键字的链表结点中记录参数在第一参数数组中的索引;
如果当前读取到的为特殊符号,包括begin、end、小括号、大括号、双引号、分号,则将当前特殊符号对应的出现次数变量加1,并且在顺序链表L0的尾部增加一个结点,将当前特殊符号的代码添加到尾部结点中;
第二模块,用于语法检查和代码优化;具体为:
所述语法检查包括:检验关键字和特殊符号对应的出现次数变量的值是否与顺序链表L0中相应关键字和特殊符号出现次数相同;根据顺序链表L0中具有配对关系的特殊符号的出现次数和位置检验配对关系是否正常;如果语法检查有错误,则停止编译并返回相应错误码;
所述代码优化为:将所述第一参数数组中的元素转化为参数链表中的结点,采用参数链表结点地址代替顺序链表L0中的第一参数数组索引;释放第一参数数组空间;
第三模块,用于实现目标码生成;具体为:
逐个访问顺序链表L0中的每个结点,如果当前结点为关键字且没有参数,则直接根据目标码生成规则生成目标码,如果当前结点为关键字且有参数,则根据结点中记录的参数链表结点地址,从参数链表中提取参数,将关键字与参数组合后根据目标码生成规则生成目标码;如果当前结点为特殊符号,则直接根据目标码生成规则生成目标码。
2.如权利要求1所述的编译器,其特征在于,所述第一模块进一步用于,如果关键字跟随的参数为triggern,则只将n的值存储到第二参数数组中;目标码生成时,如果当前结点为关键字且参数n从第二参数数组中提取,则为提取的n加上trigger的前缀,然后再生成目标码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210560608.0A CN103019801B (zh) | 2012-12-20 | 2012-12-20 | 一种应用于高速数字io波形引擎的编译器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210560608.0A CN103019801B (zh) | 2012-12-20 | 2012-12-20 | 一种应用于高速数字io波形引擎的编译器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103019801A CN103019801A (zh) | 2013-04-03 |
CN103019801B true CN103019801B (zh) | 2016-03-23 |
Family
ID=47968434
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210560608.0A Active CN103019801B (zh) | 2012-12-20 | 2012-12-20 | 一种应用于高速数字io波形引擎的编译器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103019801B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107291521B (zh) * | 2016-03-31 | 2020-12-04 | 阿里巴巴集团控股有限公司 | 编译计算机语言的方法和装置 |
CN112083917B (zh) * | 2020-08-14 | 2023-11-14 | 陕西千山航空电子有限责任公司 | 一种基于飞参数据的计算参数生成方法 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1842081A (zh) * | 2005-03-30 | 2006-10-04 | 华为技术有限公司 | 扩展巴克斯范式字符串模式匹配和解析的方法及装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH03102428A (ja) * | 1989-09-18 | 1991-04-26 | Hitachi Ltd | 高級言語のコンパイラの手続き呼出し処理方式 |
CN100480916C (zh) * | 2005-12-19 | 2009-04-22 | 深圳信息职业技术学院 | 一种基于数控代码编译器建立数控系统软件的方法 |
US8656377B2 (en) * | 2010-06-10 | 2014-02-18 | Microsoft Corporation | Tracking variable information in optimized code |
-
2012
- 2012-12-20 CN CN201210560608.0A patent/CN103019801B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1842081A (zh) * | 2005-03-30 | 2006-10-04 | 华为技术有限公司 | 扩展巴克斯范式字符串模式匹配和解析的方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN103019801A (zh) | 2013-04-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112100054B (zh) | 一种面向数据管控的程序静态分析方法和系统 | |
CN107844294B (zh) | 一种高可用的合约执行方法及系统 | |
CN107861728B (zh) | 用于传统程序语言向现代程序语言转换的方法及其系统 | |
CN106462425B (zh) | 使用复常量的方法和系统 | |
US8751823B2 (en) | System and method for branch function based obfuscation | |
US20120192163A1 (en) | Method and apparatus for compiling regular expressions | |
CN103123590A (zh) | 指令表il程序到c语言程序的编译方法 | |
EP2668574A2 (en) | Utilizing special purpose elements to implement a fsm | |
CN101799760A (zh) | 生成任意目标架构的并行单指令多数据代码的系统和方法 | |
CN102385524B (zh) | 一种基于混编指令集的编译链指令替换方法 | |
US20080244541A1 (en) | Code translator and method of automatically translating modeling language code to hardware language code | |
JP2012133756A (ja) | ヘテロジニアス黙示的及び明示的プロセッシング要素の計算の一体化のためのシステム及び方法 | |
CN101408849A (zh) | Ttcn-3语言的编译执行方法及系统 | |
US20140237458A1 (en) | Systems and Methods for Efficient Just-In-Time Compilation | |
CN110333867B (zh) | 一种多方安全计算数据处理方法、装置及系统 | |
CN103019801B (zh) | 一种应用于高速数字io波形引擎的编译器 | |
US10416971B2 (en) | Method of creating the balanced parse tree having optimized height | |
CN107368302B (zh) | 一种基于本体的设计模式识别方法 | |
CN113138755A (zh) | 一种json序列化和反序列化的优化方法及系统 | |
CN111309449A (zh) | 面向元编程、交互式编程和区块链互操作的与编程语言无关的虚拟机 | |
CN113467828B (zh) | 一种异构众核处理器中编程语言转换方法和系统 | |
CN112199217B (zh) | 一种软硬协同的线程私有数据访问优化方法 | |
CN102360306A (zh) | 高级语言代码中循环数据流图提取优化信息处理方法 | |
CN102398355B (zh) | 一种自定义命令控制方法、装置及注塑机系统 | |
Maliavko et al. | The functionally-imperative programming language El and its translator |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |