一个编译器实验的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个编译器实验的设计与实现
摘要:本文介绍了一个适合描述球类比赛战术特点的脚本描述语言,并把该语言作为实验题目进行实验教学,介绍了学生设计并实现的脚本描述语言编译器,该脚本描述语言的词法和文法描述定义,给出词法分析器和语法分析器的结构设计,最后介绍实现中采用的关键技术。
关键词:脚本描述语言;词法分析器;语法分析器
1球类脚本描述语言
随着社会文明的发展与进步,体育比赛已经成为人民文化生活中不可缺少的组成部分。2008年,北京成功举办了第29届奥林匹克运动会,运动员共打破38项世界纪录,取得了骄人的成绩。作为本次奥运会科技攻关课题组的成员,我们参加了国家乒乓球队攻关项目的研究工作,为中国乒乓球队设计实现了一个基于视频标注的技、战术分析系统。我们采用编译技术翻译乒乓球脚本描述语言,实时、准确地记录并分析比赛中发生的各种技、战术细节,为教练员提供客观翔实的分析数据。
作为“编译原理”的任课教师,我们认为该课对学生系统掌握计算机基础理论十分重要,但由于学生在今后工作中很难用到编译技术,就会产生厌学思想,因此为学生设计一个好的编译原理实验成为当务之急。为此,我们结合承担的科研课题,设计了一个既让学生感兴趣,又能加深他们对编译原理思想理解的实验。
根据球类比赛的特点和脚本描述语言的设计要求,球类比赛可分为两种:一是比赛需主、客队同台(场)竞技,如沙滩排球、乒乓球、篮球、足球和网球等;二是主、客队轮流上场,比赛对手不是同台竞技,如台球和保龄球等。第一种球类比赛具有以下特点:(1)进攻/防守形成博弈;(2)博弈双方的技术动作具有相似性。为此,我们把第一种比赛的相关技、战术描述抽象成如下形式:
队员+技术动作+技术动作发生区域+技术动作结束区域
我们的设计目标主要针对第一种比赛。脚本描述语言的语法结构如图1所示。
其中单词由英文字母构成,可以采用汉语拼音的字首进行编码;句子由单词加分隔符“●”构成。图2是一个乒乓球比赛脚本描述语言的案例。
2解释器的设计与实现
根据球类比赛技、战术分析的需求,设计的解释器由
词法器、语法器和语义分析模块三部分组成,如图3所示。其中词法分析器
负责词法分析的预处理和输入单词的解释;语法分析器负责分析输入码的语法结构检查和解释;在词法和语法分析器的基础上,语义分析模块负责比赛技战术的分类与统计工作。下面分别介绍上述逻辑部件的设计与实现。
2.1词法分析器
根据第1节对球类比赛脚本描述语言语法结构的设计以及球类比赛描述的特点,我们对该描述语言的单词符号进行设计。单词符号有以下4种:
(1) 技术动作描述符:一般由四类字符组成,英文字母、数字、“+”和“-”。其中,英文字母是技术动作的编码,由一个编码映射表支持词法解释;数字用于描述技术动作发生的区域,该语言总是把比赛场地分割成若干个不同的区域;“+”和“-”是两个特殊符号,一般用于一些极其特殊的技、战术描述,如乒乓球中的“擦边球”或“擦网”等。
(2) 间隔符:用于区分不同的技术动作,一般用“●”表示。
(3) 保留字:为了明确标示比赛视频的开始和结束、每一小节或单局比赛的开始和结束、比赛中的暂停和开始,设计了一些保留字,如Match: Start、Match: End、Set1:Start、Set1:End等。
(4) 控制符:用于比赛中的比分调整,如ap03:05、*p02:05。
上述单词符号构成单词的词法分析状态转换描述如图4所示。
上述词法分析的算法如下:
算法1一个乒乓球脚本描述语言的词法分析算法
Input: 基于乒乓球比赛脚本简码的技战术输入码
Output: 描述语言完全码
Step1: 词法检测、运动区域补偿
Word=Read(code); // 输入一个单词符号//
Do while word‘’
If field(word, Last_position )=‘●’then break
else if field(word,start_position )and field(word,target_position )= num then return //词法检测结束//
else if field(previous_word,target_position)=num
then field(word, start_position)=field(previous_word,target_position); word=read(code);
enddo
Step2: 词法检测、动作补偿
Word=Read(code); //输入一个单词符号//
Do while word‘’
If field(word, style_position )‘’then break;
else if word.artribute=offence and field(word,start_position )=right_domain //该动作为进攻动作//
then field(word, style_position)=‘z’;
else if word.artribute=offence and field(word,start_position )=left_domain //该动作为进攻动作//
then field(word, style_position)=‘f’;
else print(‘an error be found’);
word=read(code);
enddo
end
在上面的算法中,每一个单词由四位码构成,field(word, style_position)是单词的第一位,表示动作的方式;field(word, act_position)是单词的第二位,表示动作的类型;field(word, start_position)是单词的第三位,表示球的起点;field(word, target_position)是单词的第四位,表示球飞行的结束位置。该算法需要两次遍历输入码,因此算法的复杂性为O(L)。
2.2语法分析器
根据图1所示的脚本描述语言结构,它的文法G如图5所示: