自定义计算机语言编译器_第1页
自定义计算机语言编译器_第2页
自定义计算机语言编译器_第3页
自定义计算机语言编译器_第4页
自定义计算机语言编译器_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

自定义计算机语言编译器摘要汉语编程一直是所有以汉语为母语的程序员的梦想。作为以汉语为母语的程序员,每次编程时最发愁的事可能就是文档中大段大段的英语,想要找到相应功能的方法总是非常头痛。中国传统文化中易经八卦的思想又非常符合现代编程中的思想。高级计算机语言程序中任何标识都可以使用中文字、词、词组和句子的语言文法,又有与中文相匹配的语言语法规则可称为汉语编程语言,使用这种语言编写的程序的过程就是中文编程。汉语编程不但可以使编程更加普及,也能使编程效率提高。本论文研究的是基于汉语的自定义计算机编程语言N语言编译器,N语言以C语言为基础,在此上加入了一些关键字替换等,以一个单一的汉字来替换有好几个字符的英语单词,简化编程过程,提高编程效率。N语言编译器以LINUX下的QT搭建界面框架,采用C编写,主要实现了一个源(N语言)到源(C语言)的编译器及主要的语法高亮、函数折叠、查找、替换、重排版、自动补全等功能。本论文主要介绍了这一课题的编写背景、所实现的功能以及具体的开发过程。关键词汉语编程;C语言;编译器;CANEWPROGRAMMINGLANGUAGEANDITSCOMPILERABSTRACTPROGRAMMINGINCHINESEISALWAYSADREAMOFALLTHEPROGRAMMERSWHOUSECHINESEASTHEIRMOTHERLANGUAGEASONEOFTHEPROGRAMMERWHOUSESCHINESEASTHEFIRSTLANGUAGE,EVERYTIMEWHENIPROGRAM,THEMOSTTROUBLETHINGISWHENILOOKINGINTHEDOCUMENTFORAPROPERWAYTOACHIEVEMYGOAL,THEREALWAYSBEENTONSOFBILLIONSOFENGLISHWHICHANNOYEDMESOSOMUCHTOFINDOUTTHERIGHTWAYTOIMPLEMENTMYFUNCTIONSTHEZHOUYIPHILOSOPHYINTRADITIONALCHINESECULTUREISVERYSIMILARTOTHEMODERNPROGRAMMINGANYHIGHLEVELCOMPUTERPROGRAMMINGLANGUAGECANBEUSEDTOIDENTIFYTHETEXT,WORDS,PHRASESANDSENTENCESOFTHELANGUAGEGRAMMAR,BUTALSOTOMATCHWITHTHECHINESELANGUAGEGRAMMARRULESMAYBECALLEDCHINESEPROGRAMMINGLANGUAGETHEPROCESSOFUSINGTHISKINDOFLANGUAGECANCALLEDPROGRAMMINGINCHINESEPROGRAMMINGINCHINESECANNOTONLYMAKEPROGRAMMINGMOREPOPULAR,BUTALSOIMPROVETHEEFFICIENCYOFPROGRAMMINGTHISGRADUATIONTHESISTELLSABOUTASELFDEFINEDPROGRAMMINGLANGUAGETHATBASEDONCHINESETHECOMPILEROFNPROGRAMLANGUAGENISBASEDONCPROGRAMMINGLANGUAGE,EXCHANGESOMEKEYWORD,REPLACETHELONGENGLISHWORDBYASINGLECHINESECHARACTER,TOSIMPLIFYTHEPROGRAMMINGPROCESS,IMPROVETHEEFFICIENCYOFPROGRAMMINGTHISCOMPILERFORNISBASEDONQTOFLINUXTODRAWTHEINTERFACE,ISPROGRAMMEDBYCITISACOMPILERCHANGESPROGRAMLANGUAGENTOPROGRAMLANGUAGECITISASIMPLECOMPILERHADTHISFUNCTIONBASICSYNTAXHIGHLIGHT,FUNCTIONFOLDING,FINDANDREPLACE,RELAYOUTANDAUTOCOMPLETE,ETCTHISTHESISINTRODUCESTHEBACKGROUNDOFTHISTOPIC,THEFUNCTIONITCANDOANDTHESPECIFICPROGRESSOFPROGRAMMINGTHISCOMPILERKEYWORDSCHINESEPROGRAMMINGLANGUAGECLANGUAGECOMPLIERC目录摘要IABSTRACTII1绪论111N语言的定义112N编译器113汉语编程意义114开发技术22需求分析321可行性研究3211技术可行性3212经济可行性5213时间可行性522系统的功能要求5221基本功能5222附加功能623系统的性能要求7231可靠性要求7232时间要求7233稳定性要求73关键技术831QT概述832QT模块833QT图形用户界面934QT信号与槽机制935布局管理1036MAINWINDOW1037GRAPHICSVIEW1138QT元对象系统114概要设计1341系统总体结构1342N语言的定义1343C语言编辑器1444N语言编译功能的集成1445字符编码问题145详细设计与实现1751自定义计算机编程语言N语言1752编译器详细设计17521语法分析部分17522N语言的编译功能20523MAIN20524其他附加功能2153系统主要运行界面2254关键代码276系统测试3061测试方法3062测试用例30621对C语言编译功能的测试30622对N语言编译的测试31623对编辑器功能的手动测试3463测试结果35结论36参考文献37致谢38外文资料39中文翻译741绪论11N语言的定义N语言是一种自定义的编程语言,基于C语言基本语法及实现,用简洁明了易于编写便于记忆的单个汉字替换了繁杂长度惊人编写不便的英文关键字,简化了编程过程。如将IFELSE改为若其,减少输入过程,便于观察编写。方便了许多不懂英语的儿童或者其他人能够在无需多学一门外语的情况下进行编程,领略编程的魅力,有利于编程思想的普及,促进汉语母语国家计算机教育的发展。基于C语言一方面是由于大部分试验型的编程语言都会将C语言作为输出,而且C语言是很多计算机语言学习的入门语言;另一方面是因为C语言不依赖于任何虚拟机,不像JAVA一样需要依赖于JVM或者C需要NETFRAMEWORK,在大部分计算机上都有C的编译器可用。C语言是最基础的面向人类的编程语言,便于实现,有通用性,能被任何程序调用。本自定义计算机语言N语言在本地化方面改进C语言的同时保留了C的字符如“”,“”等,使得程序编写过程中可以调用C语言丰富的库函数,同时也可以继续操作指针,保留了C语言最令人心醉的特点。12N编译器本N语言编译器产生的目标程序为面向人类的程序设计语言C语言,它需要进一步的转换才能在计算机上直接执行(本编译器为GCC(GNUCOMPILERCOLLECTION,GNU编译器套装)/TCC(TINYCCOMPILER,BYFABRICEBELLARD)。由于大多数计算机上都有如上C编译器可用,这使得目标程序(即C程序)可在所有这些系统上执行,代价是需要一次额外的编译才能得到最终可运行的目标程序,类似于本N语言编译器的编译器也称为“源到源的转换器”。本编译器是在LINUX下用一个跨平台C图形用户界面应用程序开发框架QT搭建界面,方便地实现了很多功能,如复制剪切粘贴等,方便了编程过程,增加了用户编程体验。此编译器实现的辅助功能有编辑时的撤销、重做、查找、替换,格式上的自动换行、自动缩进、字体的调整,编译过程的设置,对代码进行重新排版、显示函数列表、快速注释与反注释、自动补全(主要应用于C的编写),还可以自定义界面区块的显示与否,选择内置的几种配色方案等,算是一个功能还算齐全的编译器。13汉语编程意义如今的编程都是基于英语,想要编程起码得掌握英语这门很可能会被高考抛弃的、繁杂且没有规律的语言。即使学习了英语,庞大又混乱的英语词库又成了挡在文档和编码实现之间的拦路虎。即使掌握了编程思想,过不了英语这一关,很多时候连最基本的文档都无法借鉴,对于那些拥有丰富API的编程环境更是如此,程序员只好自己想方法实现那些已有的东西,很是浪费时间。在一些有强大类库支持的语言编码中,文档多是用英语写成而且由于更新快,类数量较多,大多没有中文翻译的文档,给英语非母语国家的编程人员的提高改进造成了很大的困扰。汉语编程,比较知名的如“易语言”,一直都在努力地试着改变中国人编程的方式,想把编程的门槛降低到只要认识汉字就能编程,能方便地掌握编程思想的地步。但是易语言的缺点是关键字还是一些由汉字组成的双字词或者更多字的词,完全没有将汉语优美简洁的特性以及汉语庞大的字库体现出来。N语言这个自定义编程语言就是基于此目的,将中国传统文言文的简明融入编程语言,试着将编程变成一件充满艺术感的创作,让更多人加入到全球信息化的浪潮,给学龄前儿童或是其他已经没有精力再学习英语的人一个编程的机会,体验程序之美,学习并感受编程思想,有助于思维的发展。由于水平有限,这一设计仅仅是简单地将C语言的关键字做了汉化处理,相信在经验逐渐增加的未来,这一语言会发展壮大。14开发技术本N语言编译器及编程语言N语言的设计和编写借鉴了软件工程的思想和开发流程进行,从拿到题目时的需求分析开始,分析了本自定义计算机语言编译器实现的可行性,接下来进行概要设计,大致列出完成这一设计所需的功能框架,然后在详细设计以及编码阶段完成具体的自定义语言设计和编译器的编码,再进一步迭代,增加功能,每轮都会进行一定数量的测试,检测程序问题,找出需要改进的地方在下一轮的编码中进行改进。本编译器采用了跨平台图形用户界面应用程序开发框架QT搭建基本的界面,用面向对象语言C实现了N语言转C语言的编译功能。词法分析的过程用结构体STRUCT定义了语法行首指针,词法分析,函数列表,参数表等结构,分析输入的程序并实时加入高亮等功能,在将源程序编译为目标语言C语言后,采用了LINUX下的TCC(TINYCCOMPILER,BYFABRICEBELLARD)编译器(若检测到环境中没有集成TCC,则采用GCC)来编译目标C语言程序,跳出SHELL显示运行结果。2需求分析汉语编程一直是几乎所有以汉语为母语的程序员所想过的事情。在网上搜索“汉语编程”,会发现讨论的人数还是比较多的,褒贬不一,很多人说现今的汉语编程只是单纯地将英语单纯翻译成汉语,其他方面毫无新意。这确实是如今一个尴尬的事。表音的英语确实无法和表意的汉语相提并论,两者单纯地转换确实会发生一些不愉快的事。还有就是现代汉语和古代汉语的区别。相对于古代汉语文言文的简洁明了,现代汉语确实在表达方面稍微繁琐了一点。由字符组成的编程语言说起来其实由言简意赅的文言词表示更适合。汉语编程的优点言简意赅,易于表达。汉字不像英语那样由单纯的26个字母组成,在字库方面有着先天优势,能用单字来表示英语有时需要很长的一段单词才能完成的意思。汉语组合性强,可以很轻易就实现扩展。汉语造词能力较强,能在新事物面前保留长度不受限意义丰富的事物。汉语能在不显著增加代码量的情况下轻易就实现具有相同属性的不同对象。汉语编程的缺点汉语有多义性。有时汉语的同一句话会有不同的含义,但是这点在字符化的编程语言里由于有了种种规范,影响不是很大。编码问题在某些系统中汉字的编码是一个大问题。如此次的QT环境,编程时的注释有很多都无法正常显示,但是只要掌握了字符编码的种种奥秘,编码就不再是一个问题。21可行性研究211技术可行性自定义计算机语言编译器,实现需要设计一门自定义计算机语言并实现此语言的编译。在设计自定义语言的时候,初步的设想是综合一下已有的各类编程语言的优秀特性,完成一个近乎“全能”的编程语言。在初步学习总结的过程中主要学习了GO语言(GOOGLE,2009)、OBJECTIVEC(BRADCOX,1980)、PYTHON(GUIDOVANROSSUM,1991)、ZIMBU(VIM编写者BRAMMOLENAAR)等,总结了这几种语言的主要特性如GO语言的数组切片、函数不定参数、用逗号CASE多个值、去掉BREAK关键词(自动加入BREAK关键字);OBJECTIVEC关于类方法和实例方法的标识、方法名中插入参数、PROPERTY和SYTHESIZE关键字来自动生成属性的GETTER和SETTER;PYTHON的DICTIONERY类型实现键值对、快速枚举的FOR(IN)方法;ZIMBU的“”符号分隔数字等增加易读性。在初步设计语言的过程中忽然发现自身在编程实践方面的欠缺,没有长期经验的积累,不能针对特定的编程目的进行有效的语言特性转化,单单将语法上一些自认为不错的东西凑到一起没有太大的意义。因此,想起了在进行IOS应用编程时作为初学者,不熟悉API的时候查文档时满屏英语的费劲,便将目光转向了编程本地化,设想设计一门给英语门外汉用的汉语编程语言。设计一门汉语编程语言有国内的如“易语言”可进行借鉴,鉴于母语是汉语,对汉语的了解比较深刻,再结合一下之前学过的编程语言,设计自定义语言在技术上完全可行。自定义计算机语言的编译器的实现需要产生目标语言为C语言,所需完成的工作是界面的实现以及N语言到C语言的转换。界面的实现主要选择了大学期间学过的,比较熟悉的QT,C,完成对中文字符的转换分析以及其他一些编程时在界面上的附加功能。QT提供了很多内置类便于对界面和功能进行方便的操作。QT有信号和槽机制,添加了Q_OBJECT宏,是对所有定义了信号和槽的类所必须的,这样就可以实现QT的信号和槽机制。SIGNAL关键字实际上是一个宏,QT中C的预处理器会在编译程序找到它之前把它转换成标准C代码。SLOTS关键字也是一个宏,也可以扩展成为C编译程序能够处理的一种结构形式。在信号和槽机制中,如果信号想要和槽成功连接,他们的参数必须有相同的顺序和相同的类型,如果信号的参数比它所连接的槽的参数多,多余的参数会被忽略掉。而当参数的类型不匹配,或者信号和槽有不存在的现象,QT会发出警告。利用这点能够进行对编译器界面的操作。CLOSEEVENT是QWIDGET中的一个虚函数,当MAINWINDOW被关闭时会自动调用。可以在编译器被关闭时进行文件是否需要保存的判断。WIDGET(窗口部件)是用户界面里的一个可视化元素,该词起源于“WINDOWGADGET”(窗口配件),相当于WINDOWS中的控件(CONTROL)和容器(CONTAINER)。利用这样的控件,可以方便地实现所需编译器的界面。QT的程序和本地程序看起来一样,它能通过所模拟平台的视觉外观实现与所在平台风格的统一,利用这一点,可以编写出能够移植到不同平台使用的应用程序。在头文件中的前置声明可以使得编译过程变快,这一点对于类似本例这样较为大的程序来说,能够加快编译后的运行速度。这个头文件包含了QTGUI类的定义,在程序中包含它可以不用包含一些具体控件,在头文件中包含此头文件后可以使针对界面的编程在需要用到很多内置控件时无需导入很多的头文件。字符串中使用“DEPLOYANYWHERE”。由于各家的编译器功不一,水平良莠不齐,QT为了跨平台的兼容性,只能以“最低兼容规格”来设计。因此,QT必须有RTTI、动态创建、PERSISTENCE/SERIALIZATION的基础建设,以及建构出自己的容器组件。32QT模块QT提供的一般软件开发的模块有1QTCOREQTCORE模块。这是所有基于QT的应用程序基础,它提供了信号与槽对象间的通信机制、IO。事件和对象的处理、多线程等功能。2QTGUI。它包含了开发图形用户界面应用程序所需的功能。使用其支持的各个平台的原生图形API。它还支持反锯齿和矢量形变。还支持ARGB顶层WIDGET。3QTMULTIMEDIA。它提供了用于多媒体内容处理的QML类型集和C类集。同时提供了访问摄像头以及音频功能的API。它包含的QT音频引擎支持三维的音频回放和管理。4QTNETWORK。它提供了网络程序设计的功能。支持很多的通用协议如HTTP、FTP和DNS。还有对异步HTTP11的支持,还有较底层的TCP/IP和UDP协议,如QTCPSOCKET、QTCPSERVER和QUDPSOCKET。5QTOPENGL。它提供在应用程序中使用OPENGL和OPENGLES加入了3D图形。在WINDOWS平台上,它还支持DIRECT3D。6QTOPENVG。它提供OPENVG绘图支持的一个插件。7QTSCRIPT。它包含完全集成的ECMA标准脚本引擎、提供信号与槽机制,简化了对象间通信和QTSCRIPT调试器。8QTSCRIPTTOOLS,它是一个额外的QTSCRIPT组件9QTSQL,它将数据库集成至应用程序。支持所有主要的数据库驱动包括ODBC、MYSQL、PSQL、SQLITE、IBASE、ORACLE、SYBASE、DB2。10QTSVG,它支持SVG格式11QTWEBKIT,它集成了WEBKIT,提供了HTML浏览器引擎,便于在原生应用程序中嵌入网络内容和服务。12QTXML,它提供了XML文档的阅读器还有编写器、支持SAX和DOM。13QTXMLPATTERNSL,它提供了XQUERY和XPATH的引擎支持。14PHONON,它集成了PHONON,支持跨平台应用程序播放音频和视频内容。但是从QT5开始不支持PHONON。15QT3SUPPORT,这个模块提供兼容QT3版本的程序库16QTDECLARATIVE,一个能让QML界面流畅BUILDING的引擎。作业于QT附带工具的模块1QTDESIGNER,这是一个提供扩充QTDESIGNER的类型。2QTUITOOLS3QTHELP,它协助集成在线文件到应用程序中。4QTTEST,它提供单元测试框架和鼠标和键盘模拟功能。集成VISUALSTUDIO和KDEVELOP。QT提供的用于UNIX开发的模块QTDBUS。QT提供的用于WINDOWS开发的模块QAXCONTAINER;QAXSERVER。33QT图形用户界面QT的图形用户界面的基础是QWIDGET。QT中所有类型的GUI组件,如按钮、标签、工具栏等都派生自QWIDGET,而QWIDGET本身则是QOBJECT的子类。WIDGET负责接收鼠标、键盘还有来自窗口系统的其他事件,并描绘了自身在屏幕上的显示。每一个GUI组件都是一个WIDGET,WIDGET还可以作为容器,在其中还包含其他的WIDGET。QWIDGET不是一个抽象类型。它可以被放置在一个已经存在的用户界面中;若是WIDGET没有指定父WIDGET,当它显示时,它就是一个独立的视窗、或是一个顶层WIDGET。QWIDGET显示能力包含了透明化及DOUBLEBUFFERING。QT提供一种托管机制,当WIDGET在创建时指定父对象,就可把自己的生命周期交给上层对象管理,当上层对象被释放时,自己也会被释放。确保对象不再使用时都会被删除。34QT信号与槽机制QT利用信号与槽(SIGNALS/SLOTS)机制取代传统的CALLBACK来进行对象间的沟通。当操作事件发生时,对象会发提交一个信号(SIGNAL);而槽(SLOT)则是一个函数接受特定信号并且运行槽本身设置的动作。信号与槽之间,则通过QOBJECT的静态方法CONNECT来链接。信号在任何运行点上皆可发射,甚至可以在槽里再发射另一个信号,信号与槽的链接不限定为一对一的链接,一个信号可以链接到多个槽或多个信号链接到同一个槽,甚至信号也可连接到信号。以往的CALLBACK缺乏类型安全,在调用处理函数时,无法确定是传递正确型态的参数。但信号和其接受的槽之间传递的数据型态必须要相符合,否则编译器会提出警告。信号和槽可接受任何数量、任何型态的参数,所以信号与槽机制是完全类型安全的。信号与槽机制也确保了低耦合性,发送信号的类型并不知道是哪个槽会接受,也就是说一个信号可以调用所有可用的槽。此机制会确保当在“连接“信号和槽时,槽会接受信号的参数并且正确运行。35布局管理布局管理类型是用于描述一个应用程序的用户界面中的WIDGET是如何放置的。当视窗缩放时,布局管理器会自动调整WIDGET的大小、位置或是字号,确保他们相对的排列和用户界面整体仍然保有可用性。QT内置的布局管理类型有QHBOXLAYOUT、QVBOXLAYOUT、QGRIDLAYOUT和QFORMLAYOUT。这些类型继承自QLAYOUT,但QLAYOUT非继承自QWIDGET而是直接源于QOBJECT。他们负责WIDGET的几何管理。想要创建更复杂的版面配置,可以继承QLAYOUT来自定义版面配置管理。QHBOXLAYOUT配置WIDGET成横向一列;QVBOXLAYOUT配置WIDGET成垂直一行;QGRIDLAYOUT在平面网格中配置WIDGET;QFORMLAYOUT配置WIDGET用于两栏标签FIELD。36MAINWINDOWQT提供了下列主视窗管理和相关的用户界面组件的类型1QMAINWINDOW它提供了一个标准的应用程序主视窗。当中可以包括菜单、工具栏、状态栏、中央窗口部件等组件。本例中编译器的主界面MAINWINDOW继承了QMAINWINDOW这一个类,在中央窗口部件中实现了代码编辑的主要功能,在工具栏放置了一系列的图标进行编译器的一些辅助功能的实现,在状态栏显示了当前打开的文件名称、目录、光标所在行和代码总共的行数三项,在鼠标指针悬在相应功能图标的上方时,状态栏会显示相应自定义的提示信息。在创建这些功能时用到了QACTION,先创建QACTION,然后将其添加进功能的列表进行这些辅助功能的实现。QMAINWINDOW如图31所示。图31QMAINWINDOW结构2QDOCKWIDGET它提供了一个可用于创建弹簧工具调色板或辅助窗口的WIDGET。DOCKWIDGETS可以移、关闭、浮动为外部视窗。本例中,查找/查找替换功能利用了QDOCKWIDGET,实现了相应功能。3QTOOLBAR提供了一个通用的工具栏WIDGET,可以放入一些不同的ACTION有关的工具,如按钮、下拉列表、COMBOBOXES和SPINBOXES。本例中的工具栏就是通过QTOOLBAR实现的。37GRAPHICSVIEWGRAPHICSVIEW提供了用于管理和交互大量定制的2D图形对象的平面以及可视化显示对象的视图WIDGET,并支持缩放和旋转功能。整个GRAPHICSVIEW框架提供一个以ITEM为基础的MODELVIEW设计。由3个主要类型组成,分别是QGRPHICSITEM、QGRAPHICSSCENE和QGRAPHICSVIEW。若干VIEW可以显示一个SCENE,SCENE中则包含几个不同几何形状的ITEM。该框架包括一个事件传播的架构,可以让在SCENE上的ITEM有双精度的交互能力。ITEM能处理键盘事件,鼠标按下、移动、释放和双击的事件,他们也可以跟踪鼠标的移动。GRAPHICSVIEW使用的BSP(二进制空间划分)树可非常快速地找到ITEM,因此即使是包含百万个ITEM的大型SCENE,也能进行实时图形化显示。KDE中的PLASMA也是基于GRAPHICSVIEW实现的。38QT元对象系统QT采用了一种机制使得它对C进行了扩展,并使用了这种机制创建了独立的软件组件。这些组件能够绑定在一起,但是其中的任何一个组件对于它所要连接的组件的情况事先都一无所知。这种机制就被称作“元对象系统”(METAOBJECTSYSTEM),它提供了两项关键技术信号槽(参见四、QT信号与槽机制)已经内省(INTROSPECTION)。内省功能对于信号和槽的实现是必须的,还允许开发人员在运行时获得有关QOBJECT子类的“元信息”(METAINFORMATION),这个元信息包括了一个含有对象的类名还有它所支持的信号和槽的列表。这一机制也支持属性和文本翻译,并对QTSCRIPT模块打下基础。标准的C没有对QT元对象系统所需的动态元信息提供支持。因此QT提供了一个独立的MOC工具来解决这一问题。MOC解析Q_OBJECT类的定义并且通过C函数来提供可供使用的信息。MOC使用了C实现,因此QT的元对象系统可以在任意C编译器上工作。它的工作原理如下Q_OBJECT宏声明了每个QOBJECT子类中必须实现的一些内省函数METAOBJECT()、TR()、QT_METACALL()以及其他的一些函数。QT的MOC工具生成了用于由Q_OBJECT声明的所有函数和所有信号的实现。CONNECT()和DISCONNECT()这样的Q_OBJECT的成员函数使用这些内省函数完成他们的工作。4概要设计41系统总体结构本系统在设计时基本分为两个部分。第一部分是设计一门自定义编程语言N语言,第二部分是实现N语言的编译功能。N语言,是根据C语言基本语法等实现的一门汉语编程语言,将其关键字进行单个汉字替换,简化了编程过程。C语言编译部分采用了计算机自带的GCC/TCC进行C语言的编译,完成编译过程。汉语编程的意义相对来说还是比较重要的。汉语编程能使得许多没有英语基础的人也能很好地掌握编程方法、编程思想,能使得更多的人参与到编程这一意义深远的事件中来。汉语编程能使一个人在掌握一门外语之前就掌握逻辑分析思维方法,让计算机的原理等被更多的人熟知。汉语编程更符合中国人的习惯,使它更容易被中国人接受。于此同时,C语言的保留关键字也得到了保留,使人们在用汉语编程的同时可以继续利用C语言的关键字进行编程,更加符合用户习惯,也促使了汉语母语编程人员更快地向国际化发展。N语言的编译器界面主要采用QT搭建,利用QT强大的可视化和丰富的内置类,将编译器界面和功能的实现变得简单高效。42N语言的定义N语言是一种基于C语言的中文编程语言。在世界最经久不衰的C语言基础上增加了汉语编程功能。N语言是一个简单的自定义语言,除了替换关键字,其他方面和C语言没有太大区别,优点就是有利于编程的输入控制和对语言的了解。汉语的优点就在于它的简洁明了,能用一个单字将英文字符中表音的一长串字母简化,在输入的时候优点非常明显。作为已经发展了这么多年的表意字,汉语的优点是被全世界承认的。在二进制下,逐渐有了机器码,慢慢地演变成了汇编语言,接下来又出现了许多其他语言。C的产生虽然比较早,但由于它能操纵底层的特性,在现在仍然有着举足轻重的地位。汉语编程的优势还在于文化方面的优势。据说,当时莱布尼茨二进制的发明就是受到了阴阳思想的启发。布维是一位汉学大师,他对中国的介绍是17、18世纪欧洲学界中国热最重要的原因之一。布维是莱布尼茨的好友,一直与他保持着频繁的书信往来。莱布尼茨曾将很多布维的文章翻译成德文,发表刊行。正是布维向莱布尼茨介绍了周易和八卦的系统,并说明了周易在中国文化中的权威地位。八卦是由八个符号组构成的占卜系统,而这些符号分为连续的与间断的横线两种。这两个后来被称为“阴”、“阳”的符号,在莱布尼茨眼中,就是他的二进制的中国翻版,但实际莱布尼茨是受中国阴阳太极影响,只不过他付出了诸多研究,推演出二进制。他感到这个来自古老中国文化的符号系统与他的二进制之间的关系实在太明显了,因此断言二进制乃是具有世界普遍性的、最完美的逻辑语言。43C语言编辑器在确定了自定义语言N语言是由C语言转化之后,首先要做的就是完成一个C语言的编辑器。本毕业设计在系统内直接选择集成了TCC或者GCC编译器,将C语言进行编译。编辑器(COMPILERFORN)是由LINUX下的QT实现的。QT的主要技术已在上一章节中阐明,优秀的图形编辑使得本编辑器的实现变得较为简单。首先在MEMORYSTRUCT头文件中定义了语法行首指针、词法分析、函数列表、参数表、行号表、补全表的结构。MEMORYCENTER类声明了用于实现语法管理的指针和方法。MEMORYPRIVATECPP和MEMORYPUBLICCPP文件中实现了上述方法。TEXTBLOCKDATA类中定义并实现了函数代码块的判断。SYNTAXHIGHLIGHTER继承于QT的QSYNTAXHIGHLIGHTER类,主要实现了关键字的高亮。CPADPALETTE定义了几种预置样式,能快速地选择相应的样式实现编辑环境的配色。CODEEDITOR继承于QT的QPLAINTEXTEDIT类,是编辑器的主要编辑区域。编辑器的主要面板是在CENTERWIDGET中实现的,它实现了编辑器的主要功能。AUTOCOMPLE类主要实现了自动补全的功能,对于很多第一次编程或者对英语不熟的人,在试着将关键字写为英语单词时这个功能就发挥了很大用处。COMPILECONFIG主要是一些关于编译设置的内容。其中定义了编译时的编译器选择(TCC/GCC)、创建文件、保存文件内容、打开控制台等方法,实现了编译的过程。FINDREPLACEAREA定义了查找和替换的实现。FUNCTIONFOLDAREA主要实现了函数块的折叠和显示。FUNCTIONLISTAREA实现了函数列表的展示。LINENUMBERAREA实现了行号的显示,方便代码的阅读。RECOMPOSEDIALOG实现了代码的重排版,让代码更加规范,更加便于阅读。RUNCOMPILE实现了程序的编译和运行。STATUSBAR是编辑器下方的状态栏,显示了光标所在的位置。MAINWINDOW继承了QMAINWINDOW,集成了上述的所有功能,完成了这个编辑器的基本界面。44N语言编译功能的集成MEMORYPRIVATECPP中的KEYWORDLIST中添加了新增的汉语关键字,实现了汉语关键字的高亮功能。RUNCOMPILE文件中在编译之前加入了对于汉字的处理,使得N语言的编译变得异常简便。在对程序中的汉字关键字进行处理后,本例中将转换后的程序(CONFILENAME)传给GCC/TCC,实现对N语言最终的编译。45字符编码问题字符编码问题一直是非英语母语语言国家的人在使用计算机时的一个问题,很多时候当你从网上下载一篇文档,却发现打开后是一堆乱码,这个确实是一件很令人头疼的问题。ASCII码能表示的字符个数是256对于只有26个字母的英语来说,它可以很好地表示。但是对于汉字这样的字符集庞大的语言来说,ASCII就显得无能为力了。因此有了GB2312、GBK、GB18030等中国的标准编码。对于其他语言来说,人们制定了UNICODE这一世界通用的标准来支持多种语言文字。QT为字节流和字符串分别提供了QBYTEARRAY和QSTRING两个类还有QLATIN1STRING等其他类,但这两个是最主要的。当我们涉及到I/O如读写文件、读写网络SOCKET、控制台输入输出、读写串口等,操作的都是字节流,如果我们此时需要操作的内容是字符串,将会需要二者之间的相互转换。在C和C中,我们一般都是将“HELLOWORLD“这种称为字符串。但是就目前而言,当我们提字符串时,一般是指一个UNICODE字符串,其由一个一个的UNICODE字符构成;当我们提字节流时,是指一个一个的字节。或许我们可以说,ANSIC/C截止目前只有字节流,而缺乏对字符串的支持。另外各个编译器对编码的支持又严重不一,因此QT为解决这个问题提供了QTEXTCODEC。一旦在QT程序中出现LATIN1字符集以外的字符,几乎大家无一例外的会用到QTEXTCODEC。甚至有许多人不分青红皂白,一旦用到中文,就同时使用下面3条指令QTEXTCODECTEXTCQTEXTCODECCODECFORNAME“GBK“QTEXTCODECSETCODECFORCSTRINGSTEXTCQTEXTCODECSETCODECFORTRTEXTCQTEXTCODECSETCODECFORLOCALETEXTC这3条指令简单来说就是为了实现字符串与字节流之间的转换也就是字符的编码和解码。QSTRING其实不存在中文支持问题,很多人遇到的问题,并不是QSTRING的问题,而是没有将自己希望的字符串正确地赋给QSTRING。很简单的问题,“我是中文“这样写的时候,它是传统的CHAR类型的窄字符串,我们需要的只不过是通过某种方式告诉QSTRING这四个汉字采用的是哪种编码。而问题一般都出在很多用户对自己当前的编码没太多概念。另外文件是有编码的,但是这种纯文本文件却不会记录自己采用的编码,这个是问题的根源。真的是QSTRING乱码了吗其实很简单的一个问题,当你从窄字符串CHAR转成UNICODE的QSTRING字符串的时候,你需要告诉QSTRING你的这串CHAR中究竟用的是什么编码GBK、BIG5还是LATIN1。理想情况就是将CHAR传给QSTRING时,同时告诉QSTRING自己的编码是什么;但是QSTRING提供的成员函数,远远满足不了大家的需求,于是只有采取语句1的办法。TR是用来实现国际化的,前提是你为这个程序提供了翻译包,但是他需要经过多级函数调用才实现了翻译操作,是有代价的,所以不该用的时候最好不要用。相比QCOREAPPLICATIONTRANSLATE,TR被应用的更多一些。TR“中文”与QSTRING“中文“一样,你必须告诉TR这个窄字符串是何种编码,不告诉它,它就用LATIN1。于是所谓的乱码问题就出来了。如何告诉TR你写的这几个汉字在磁盘中保存的是何种编码呢这正是语句2所做的。如果你的编码采用的UTF8,可以直接使用TRUTF8而不必设置SETCODECFORTR。对于语句3应该没什么好说的,在绝大多数情况下,我们在代码中应该都用不到这个函数默认的SYSTEM应该比我们所能设置的要好。PS一个使用QTEXTCODEC类的QT程序,在具有QT开发环境下的WINDOWS上运行很正常,而在没有QT开发环境下的WINDOWS上运行,在运行到QTEXTCODEC对象时,就会弹出遇到错误。程序里注消了QTEXTCODEC对象代码,程序运行正常,但不能处理中文了。QT中带了很多插件PLUGIN,在QT目录下的“QTPLUGINS“下有一个“CODECS“的文件夹。下面的文件从文件名就可以区别出来是“简体中文,繁体中文,日文,韩文”的编码插件。将该文件夹拷贝到程序所在的目录,程序运行就正常了(当然,CODECS文件下面的“A“文件都可以删除,“DLL“文件也可以把带“D“的DEBUG版本的删掉。注意的是一定要把CODECS文件夹放在发布程序的同目录下,且不要更改目录名字。)。总之除了QT运行的CORE和GUI等库,使用QTEXTCODEC类后,程序打包的时候别忘了带上PLUGINSCODECS。5详细设计与实现51自定义计算机编程语言N语言自定义计算机语言N语言的主要特点是语言替换,替换了以下关键字INCLUDE含,DEFINE定,IFNDEF未,ENDIF束,SIZEOF量,CASE选,DEFAULT默,TYPEDEF型,STRUCT构,UNION联,ENUM举,IF若,ELSE其,FOR条,DO做,WHILE当,SWITCH转,GOTO去,BREAK破,CONTINUE继,RETURN返,CONST常,AUTO自,UNSIGNED无,SIGNED有,VOLATILE易,REGISTER寄,STATIC静,EXTERN外,SHORT短,LONG长,VOID空,CHAR符,INT整,FLOAT精,DOUBLE双,_INT8整8,_INT16整16,_INT32整32,_INT64整64另外,有常用的函数如“MAIN主”,“PRINTF印”也进行了相应的替换。除此之外其他用法和C语言基本相同。52编译器详细设计编译器的实现由以下部分完成521语法分析部分1MEMORYSTRUCT头文件中定义了语法行首指针、词法分析、函数列表、参数表、行号表、补全表的结构。语法行首指针结构定义STRUCTLINEHEADPOINTERINTLOGICLEVEL/存放该行逻辑等级INTLINEPOSITION/存放该行在原文中的位置STRUCTLINEHEADPOINTERPREVIOUSLINE/存放上一语法行STRUCTLINEHEADPOINTERNEXTLINE/存放下一语法行STRUCTLEXICALANALYSISFIRSTWORD/存放本语法行首单词词法分析结构定义STRUCTLEXICALANALYSISQSTRINGWORDCONTENT/存放该词内容INTWORDLENGTH/存放原词长度INTWORDCATEGORY/存放原词类型INTWORDPOSITION/存放原词在原文中位置STRUCTLINEHEADPOINTERWHICHLINE/存放该词所在行STRUCTLEXICALANALYSISPREVIOUSWORD/存放上一语法词STRUCTLEXICALANALYSISNEXTWORD/存放下一语法词函数列表结构定义STRUCTFUNCTIONLISTQSTRINGFUNCTIONNAME/存放函数名称INTFUNCTIONNAMELENGTH/存放函数名称长度QSTRINGFUNCTIONCATEGORY/存放函数类型INTFUNCTIONCATEGORYLENGTH/存放函数类型长度INTPARAMETERNUMBER/存放参数个数INTFUNCTIONPOSITION/存放函数在原文中的位置INTFUNCTIONLINE/存放函数在原文中所在行QSTRINGFUNCTIONOUTPUT/存放函数列表输出格式STRUCTPARAMETERLISTFIRSTPARAMETER/存放参数表首个参数STRUCTFUNCTIONLISTPREVIOUSFUNCTION/存放上一个函数STRUCTFUNCTIONLISTNEXTFUNCTION/存放下一个函数参数表结构定义STRUCTPARAMETERLISTQSTRINGPARAMETERNAME/存放参数名称INTPARAMETERNAMELENGTH/存放参数名称长度QSTRINGPARAMETERCATEGORY/存放参数类型INTPARAMETERCATEGORYLENGTH/存放参数类型长度QSTRINGPARAMETERTAIL/存放参数尾部INTPARAMETERTAILLENGTH/存放参数尾部长度STRUCTFUNCTIONLISTWHICHFUNCTION/存放该参数所在函数STRUCTPARAMETERLISTPREVIOUSPARAMETER/存放上一参数STRUCTPARAMETERLISTNEXTPARAMETER/存放下一参数行号表结构定义STRUCTLINENUMBERLISTINTLINENUMBER/存放行号INTLINEPOSITION/存放当前行在原文的位置STRUCTLINENUMBERLISTNEXTLINENUMBER/存放下一行号补全表结构定义STRUCTCOMPLELISTQSTRINGCOMPLENAME/存放变量名称INTCOMPLENAMELENGTH/存放变量名称长度STRUCTCOMPLELISTPREVIOUSCOMPLE/存放上一变量STRUCTCOMPLELISTNEXTCOMPLE/存放下一变量2MEMORYCENTERMEMORYCENTER类包含了MEMORYSTRUCT头文件,声明了与词法分析,语法分析相关的方法PRIVATE存放语法行首指针的头指针STRUCTLINEHEADPOINTERMEMORYHEAD存放函数列表首指针的头指针STRUCTFUNCTIONLISTFUNCTIONHEAD存放补全名称表首指真的头指针STRUCTCOMPLELISTCOMPLEHEAD存放行号表首指针的头指针STRUCTLINENUMBERLISTLINENUMBERHEAD存放运算符和关键词的表QSTRINGKEYWORDLIST130置新语法行函数VOIDRESETLINE置新函数列表函数VOIDRESETFUNCTIONLIST置新变量表函数VOIDRESETCOMPLELIST置新行号表函数VOIDRESETLINENUMBERLIST建立关键词表函数VOIDBUILDKEYWORDLIST建立行号表函数VOIDBUILDLINENUMBERLISTQSTRINGCODESTRING判断词类型函数INTJUDGEWORDCATEGORYCONSTQSTRING切割单词函数QSTRINGCUTWORDCONSTQSTRING大括号词法分析函数STRUCTLINEHEADPOINTERANALYSISBRACESCONSTQSTRING宏定义词法分析函数STRUCTLINEHEADPOINTERANALYSISMACROCONSTQSTRINGCODESTRING,CONSTQSTRING分号词法分析函数STRUCTLINEHEADPOINTERANALYSISSEMICOLONCONSTQSTRINGCODESTRING,CONSTQSTRING注释词法分析函数STRUCTLINEHEADPOINTERANALYSISREMARKCONSTQSTRINGCODESTRING,CONSTQSTRING其他非关键词词法分析函数STRUCTLINEHEADPOINTERANALYSISOTHERCONSTQSTRINGCODESTRING,CONSTQSTRING关键词词法分析函数STRUCTLINEHEADPOINTERANALYSISKEYCONSTQSTRINGCODESTRING,CONSTQSTRING置新语法行逻辑等级函数VOIDRESETLOGICLEVEL语法行逻辑等级分析函数VOIDANALYSISLOGICLEVEL根据要求格式重排版函数QSTRINGRELAYOUTSTYLEINTSTYLENUMBER重排版多行注释函数QSTRINGRELAYOUTREMARKINTLOGICLEVEL,QSTRINGREMARKSTRING生成函数结构函数STRUCTFUNCTIONLISTANALYSISFUNCTIONLINEHEADPOINTERMEMORYTEMPPUBLIC词法分析主体函数BOOLANALYSISMAINQSTRING提取语法行首指针函数STRUCTLINEHEADPOINTERGETLINEHEAD生成函数列表函数BOOLMAKEFUNCTIONLISTQSTRING提取函数列表函数STRUCTFUNCTIONLISTGETFUNCTIONLIST生成补全表函数BOOLMAKECOMPLELIST查询补全表函数STRUCTCOMPLELISTFINDCOMPLELISTQSTRING重排版函数QSTRINGRELAYOUTINTSTYLENUMBER自动缩进函数INTAUTOINDENTQSTRING缩进变更函数INTCHANGEINDENTQSTRING生成函数标准注释函数QSTRINGMAKEFUNCTIONREMARK3MEMORYPRIVATEMEMORYPRIVATE实现了MEMORYCENTER中的PRIVATE方法。MEMORYPUBLICM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论