一种编译器前端自动构造的方法

文档序号:9810257阅读:414来源:国知局
一种编译器前端自动构造的方法
【技术领域】
[0001]一种编译器前端自动构造的方法主要涉及计算机算法领域。
【背景技术】
[0002]编译器的工作过程一般可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。前端主要指与源语言有关但与目标机无关的词法分析、语法分析、语义分析与中间代码产生程序。词法分析器、语法分析器的自动构造技术已经日趋成熟,知名的工具软件有:LEX(lexical analyzer generater)类软件,能生成c代码的词法分析器;YACC (yet another compiIer-comliIer))类软件,能生成0代码的语法分析器。以往它们常作为手工编写编译器的有益补充,仅自动生成编译器的一部分代码。文中将讨论如何综合运用这些软件,通过合理设置接口,真正实现一遍扫描编译器前端的全程自动构造,从而大大缩短编译器的开发周期。使用一遍扫描编译器前端的全程自动构造技术,程序员所需作的准备工作为:首先对要编译的语言进行深入分析,归纳出句子的上下文无关文法,并整理出产生式中终结符与非终结符;约定一个终结符就对应一种单词)种别,并写出每个单词种别的正则表达式描述;在上下文无关文法基础上,提炼出必要的属性,添加语义规则。可以看出,这个准备工作量大大少于以往手工编写编译程序的准备工作量。
[0003]

【发明内容】

通过国家专利检索没有发现关于此系统方面的申请资料。
[0004]此方法首先是设置词法分析过程与语法分析过程的接口:利用YACC类工具可自动完成这个编码工作,并生成一个独立的宏定义头文件。在LEX源程序中引用这个头文件后,就能简单直观地书写返回语句,形如:return终结符名。其方法归纳为:
第一步:在YACC源程序中,声明所有的终结符;
例:%token IDENTIFIER INTEGER.第二步:编译这个YACC源程序,可自动生成一个宏定义头文件,通常名为FILENAME-TAB.H ;
第三步:在LEX源程序前面引用这个宏定义头文件。
[0005]利用YACC类工具软件会自动定义一个系统变量yylval,它的数据类型可以由用户指定,存放的是当前终结符的属性值,,在语义规则的描述中用$n表示第η个文法符号的属性值,如果这个文法符号是终结符,那么系统默认$n=yylval。
[0006]在LEX源程序中,声明Y是一 YLVAL个外部变量后就可以直接使用该变量。
[0007]当前单词的细节值赋给yylval,则在YACC自动构造的程序中就能够得到当前终结符的属性值。
[0008]简而言之,接口设置方法归纳为:
第一步:在YACC源程序中,定义属性的复合数据类型。例如:
%UN10N{CHAR * STR;
INT VAL;}
第二步:申明各个终结符属性的数据类型。例如:
% TOKEN identifier integer%type <str> IDEXNTIFIER%type <val> INTEGER
第三步:在LEX源程序中,声明yylval为外部变量,并将属性值赋给它。例如: typedef un1n{ char 氺 str; int val;
}YYSTYPE;
extern YYSTYPE yylval;
% %
[a-zA-Z]([a-zA-Z]|[0—9]|
{yylval.str=......;
retrun IDENIFIER}
第二.预置三级错误陷阱;
分别在LEX源程序中正则表达式部分、FLEX源程序产生式部分、FLEX源程序语义规则部分设置错误等待语句,使编译器工作时,能在词法分析、语法分析、语义分析过程中分别俘获词法级错误、语法级错误、语义级错误。
[0009]1.在LEX源程序中,预置词法级错误陷阱 ……/ *正则表达式* /
/*与以上所有正则表达式都不能匹配的字符串*/{
/*预置的这个词法级错误陷阱能够俘获非法字符串*/
/ *报告词法错误:“发现非法字符串”,并作相应处理* /}
2.在YACC源程序产生式部分,设置语法级错误陷讲command:command exp ‘; ’ {...} exp ‘; ’ {-}
exp/ *预置的这个语法级错误陷阱能够俘获非法表达式* /
yyerror ( “表达式书写有误”,并进行错误校正!);}
3.在YACC源程序的产生式对应的语义规则部分,设置语义级错误陷阱
exp: exp H ‘ / ’ term { / *预置的这个词法级错误陷讲能够俘获除数为零错误* / if ($3==0)
yyerror (“除数为M”,并进行错误校正!);
……
【主权项】
1.一种编译器前端自动构造的方法其主要特征是通过设置词法分析过程与语法分析过程的接口达到其要求。2..根据权利要求1所要求的则利用YACC类和LEX中所声明的方法进行解释。3.根据权利要求2所述利用YACC类其方法是在YACC源程序中,声明所有的终结符。4.根据权利要求3所述则可自动生成一个宏定义头文件,通常名为FILENAME-TAB.H。5.根据权利要求4所述则在LEX源程序前面引用这个宏定义头文件。6.根据权利要求2所述LEX源进行接口设置的方法则是在YACC源程序中,定义属性的复合数据类。7.根据权利要求6所述申明各个终结符属性的数据类型。8.根据权利要求7所述在LEX源程序中,声明yylval为外部变量,并将属性值赋给它。
【专利摘要】一种编译器前端自动构造的方法实现了编译器前端的自动构造技术,能大大提高编译类软件的开发效率。此方法如何合理设置接口,以便综合运用词法、语法分析器的自动构造工具LEX和YACC。提出了预置三级错误陷阱来分别俘获源程序词法、语法、语义错误的思想,能减少错误级联,并能更准确地报告错误的性质。
【IPC分类】G06F9/44, G06F9/45
【公开号】CN105573727
【申请号】CN201410534193
【发明人】不公告发明人
【申请人】镇江鼎拓科技信息有限公司
【公开日】2016年5月11日
【申请日】2014年10月13日
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1