实验一词法分析器的设计 (2) 1.1 词法分析器的结构和主要任务 (2) 1.1.1 输入输出接口 (2) 1.1.2 条件限制 (2) 1.2 词法分析程序的总体设计 (3) 1.3 词法分析程序的详细设计 (4) 1.4实验步骤 (5) 1.5输入数据 (15) 1.6结果输出 (15)
实验一词法分析器的设计 实验目的:掌握词法分析的概念,设计方法,熟悉高级语言中词法的定义,词法分析程序的编写。 实验要求:在8学时内实现SAMPLE语言的词法分析器,要求用VC窗口界面实现。 实验内容:分为4次实验完成。 1.1 词法分析器的结构和主要任务 1.1.1 输入输出接口 图1-1词法分析器的输入输出界面 词法分析程序的主要任务是从左到右扫描每行源程序,拼成单词,换成统一的内部表示(token)输出,送给语法分析器。具体包括: 1.组织源程序的输入; 2.按规则拼单词,并转换成二元形式; 3.滤掉空白符,跳过注释、换行符及一些无用的符号(如字符常数的引号) 4.进行行列计数,用于指出出错的行列号,并复制出错部分; 5.列表打印源程序; 6.发现并定位词法错误; 7.生成符号表。 token文件和符号表用作语法分析的输入部分。 1.1.2 条件限制 本实验可以作如下假定: (1) 假定SAMPLE语言采用自由格式书写; (2) 可以使用注解,用/*……*/或者{……}标识,但注解不能插在单词内部,注解要在一行内结束,若一行结束,没有遇到注释后面的结束标记,自动认为注释也结束; (3) 一行可以有多个语句,一个语句也可以分布在多行中,单词之间和语句之间可以插入任意空格,单词中间不能有空白符号,单词中间也不能有回车换行符,即单词不能跨行书写; (4) 关键字都是保留字。
中文汉语语法 一、语素 语素和语素分类语素是最小的语音语义结合体,是最小的语言单位。语素按音节分类可以分成:单音节 语素,双音节语素,多音节语素。 ①单音节语素如土、人、水、风、子、民、大、海等。 ②双音节语素组成该语素的两个音节合起来才有意思,分开来没有与该语素有关的意义,双音节语素主要包括联绵字、外来词和专用名词。 A.双声,声母相同的联绵字:如琵琶、乒乓、澎湃、鞑靼、尴尬、荆棘、蜘蛛、踯躅、踌躇、仿佛、瓜葛、忐忑、淘汰、饕餮、倜傥、含糊、慷慨、叮当、蹊跷、玲珑、犹豫等。 B.叠韵,韵母相同的联绵字:如从容、葱茏、葫芦、糊涂、匍匐、灿烂、蜿蜒、苍茫、朦胧、苍莽、邋遢、罗嗦、怂恿、螳螂、桫椤、倥侗、蜻蜓、轰隆、当啷、惝恍、魍魉、缥缈、飘渺、耷拉等。 C.非双声叠韵联绵字:如蜈蚣、蓊郁、珊瑚、疙瘩、蚯蚓、惺忪、铃铛、奚落、褡裢、茉莉、蚂螂、窟窿、伉俪、蝴蝶、笊篱、蹦达、蟪蛄、狡狯、狡猾、蛤蚧、蛤蜊、牡丹、磅礴、提溜等。 D.外来词,由汉语以外的其他语种音译过来的词语。如干部、涤纶、甲克(夹克)、的士、巴士、尼龙、吉普、坦克、芭蕾、哒爹等。 E.专用名词,主要是地名、人和事物名称。如纽约、巴黎、北京、苏轼、李白、孔子、萝卜、菠菜、番茄、红薯等。 ③多音节语素 主要是拟声词、专用名词和音译外来词。如:喜马拉雅、珠穆朗玛、安迪斯、法兰克福、奥林匹克、白兰地、凡士林、噼里啪啦、淅淅沥沥、马克思主义、中华人民共和国。 二、词 词是由语素组成的最小的造句单位。有两种分类方式,1、按构成方式分单纯词和合成词;2、按词性分为实词和虚词。 从构成方式来看,可以分成: ①单纯词:由一个语素组成的词,自由的单音节语素和所有的双音节、多音节语素都可以组成单纯词。如:山、水、天、地、人、有、土、红、凑;仿佛、苍茫、蜈蚣、琉璃、参差、蹉跎;敌敌畏、阿司匹林、萨克斯、麦克风等。 ②合成词:由两个或两个以上的语素组成的词。 从词性来看,可以分成:实词共6个有实际意义的词,包括: (1)名词:表示人或事物名称的词。 有人物名词:如学生、群众、老头、妇女、同志、叔叔、维吾尔族、酒鬼等; 有事物名词:如笔、杉木、蜗牛、猎豹、奥托、棒球、战斗机、冥王星、思想、中学、物理、过程等; 有时间名词:如上午、过去、将来、午夜、三更、甲戊、世纪等; 有方位名词:如东南、上面、前方、内部、中间等。 (2)动词:表示动作行为及发展变化的词。 有行为动词:如跑、唱、喝、敲、吆喝、盯、踢、闻、听、摸; 有发展动词:如生长、枯萎、发芽、结果、产卵; 有心理动词:如喜欢、恨、气愤、觉得、思考、厌恶; 有存现动词:如消失、显现、有、丢失、幻灭; 有使令动词:如使、让、令、禁止、勒令;
词法分析小结 词法分析是编译器工作的第一阶段,它的工作就是从输入(源代码)中取得token,以作为parser(语法分析)的输入,一般在词法分析阶段都会把一些无用的空白字符(whitespace,即空格、tab和换行)以及注释剔除,以降低下一步分析的复杂度,词法分析器一般会提供一个gettoken()这样的方法,parser可以在做语法分析时调用词法分析器的这个方法来得到下一个token,所以词法分析器并不是一次性遍历所有源代码,而是采取这种on-demand的方式:只在parser需要时才工作,并且每次只取一个token。 token和lexeme 首先,token不等于lexeme。token和lexeme的关系就类似于面向对象语言中“类”和“实例”(或“对象”)之间的关系,这个用中文不知该如何解释才好,比如语言中的变量a和b,它们都属于同一种token:identifier,而a的lexeme是”a”,b则是”b”,而每个关键字都是一种token。token可以附带有一个值属性,例如变量a,当调用词法分析器的gettoken()时,会返回一个identifier类型的token,这个token带有一个属性“a”,属性可以是多样的,例如表示数字的token
可以带有一个表示数字值的属性,它是整型的。 如下代码: intage=23; intcount=50; 可以依次提取出8个token:int(值为”int”),id(值为”age”),assign(值为”=”),number(值为整型数值23),int(值为”int”),id(值为”count”),assign(值为”=”),number(值为50) 正则表达式 正则表达式可以用来描述字符串模式,例如我们可以用digit+来表示number的token,其中digit表示单个数字(这里说正则表达式并不完全和实现的正则引擎所识别的正则表达式等价,这里只是为了描述问题而已)。 然而像c语言的的多行注释,用正则表达式来描述就比较麻烦,此时更倾向于直接用有穷自动机(finiteautomaton)来描述,因为用它来描述非常直观且很容易。
第30卷第1期计算机学报v01.30No.12007年1月CHINESEJOURNAL0FCOMPUTERSJan.2007 基于多知识源的中文词法分析系统 姜维王晓龙关毅赵健 (哈尔滨工业大学计算机科学与技术学院哈尔滨150001) 摘要汉语词法分析是中文自然语言处理的首要任务.文中深入研究中文分词、词性标注、命名实体识别所面临的问题及相互之间的协作关系,并阐述了一个基于混合语言模型构建的实用汉语词法分析系统.该系统采用了多种语言模型,有针对性地处理词法分析所面临的各个问题.其中分词系统参加了2005年第二届国际汉语分词评测,在微软亚洲研究院、北京大学语料库开放测试中,分别获得F量度为97.2%与96.7%.而在北京大学标注的《人民日报》语料库的开放评测中,词性标注获得96.1%的精确率,命名实体识别获得的F量度值为88.6%. 关键词词法分析;汉语分词;词性标注;命名实体识别;语言模型 中图法分类号TP391 ResearchonChineseLexicalAnalysisSystemby FusingMultipleKnowledgeSources JIANGWeiWANGXiao—LongGUANYiZHAOJian (Sc^oozo,Com户“ferSciPncBn咒d:I。≥c^720fogy,Har6f雄j知s£it“抛o,T奢c^竹。zogy,H口r6in150001) AbstractChineselexicalanalysisisthefoundationtaskformostChinesenaturallanguagepro—ces8ing,Inthispaper,wordsegmentation,POStagging,namedentityrecognitionandtheirrela—tion-arewelldiscussed.IⅥoreover,apragmaticlexicalanalysissystembasedonmixedlanguagemodelsispresented,whichadoptsmanymodels,suchas以一gram,hiddenIⅥarkovmodel,maxi—mumentropymodel,supportvectormachineandconditionalrandomfields,theyhavegoodper~formanceinthespecialsub—tasks.TheWordSegmenterparticipatedintheSecondInternationalChineseWordSegmentationBakeoffin2005,andachieved97.2%and96.7%intermsofF~measureinMSRandPKUopentestrespectively.WhilethePOSta套gingandnamedentityrecog~nitionmodulesachieved96.1%inprecisionand88.6%inF—measurerespectivelyinopentestwiththecorpusthatcamefromsiX-monthcorporaofChinesePeoples’Daily. KeywordslexicalanaIysis;Chinesewordsegmentation;part—of—speechtagging;namedentityrecognition;languagemodel 引 词法分析主要包括分词、词性标注与命名实体识别三项子任务,它是句法分析与语义分析的基础,其性能将直接影响到后续应用,如机器翻译、信息抽取、问答系统的性能.本文以国家自然科学基金重点项目“问答式信息检索的理论与方法”为背景,全面 收稿日期:2005—11一15;修改稿收到日期:2006一06一06.本课题得到国家自然科学基金重点项目“问答式信息检索的理论与方法”(60435020)及国家自然科学基金(60504021)资助.姜维,男,1978年生,博士研究生,研究方向为自然语言处理、词法分析、信息抽取.Bmail:jwSeaBreeze@hit.edu.cn.王晓龙,男,1955年生,教授,博士生导师,主要研究领域为人工智能、自然语言处理.关毅,男,1970年生,博士,副教授,研究方向为问答系统、web挖掘.赵健,男,1975年生,博士,研究方向为中文命名实体识别、信息抽取.吉目 万方数据
昆明理工大学信息工程与自动化学院学生实验报告 (2012 —2013 学年第 1 学期) 课程名称:编译原理开课实验室:信自楼44 年月日 一、实验目的及内容 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 二、实验原理及基本技术路线图(方框原理图或程序流程图) 对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。 三、所用仪器、材料(设备名称、型号、规格等或使用软件) W INDOWS下的VISUAL C++6.0; 四、实验方法、步骤(或:程序代码或操作过程) #include
#define MAX 22 char ch =' '; string key[15]={"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat"}; int Iskey(string c){ //关键字判断 int i; for(i=0;i 中文语法的基本知识 一.语素和语素分类: 语素是最小的语音语义结合体,是最小的语言单位。语素按音节分类可以分成: ①单音节语素:如土、人、水、风、子、民、大、海等。 ②双音节语素,组成该语素的两个音节合起来才有意思,分开来没有与该语素有关的意义,双音节语素主要包括联绵字、外来词和专用名词。 A.双声,声母相同的联绵字:如琵琶、乒乓、湃、鞑靼、尴尬、荆棘、蜘蛛、踯躅、踌躇、仿佛、瓜葛、忐忑、淘汰、饕餮、倜傥、含糊、慷慨、叮当、蹊跷、玲珑、犹豫等。 B.叠韵,韵母相同的联绵字:如从容、葱茏、葫芦、糊涂、匍匐、灿烂、蜿蜒、苍茫、朦胧、苍莽、邋遢、罗嗦、怂恿、螳螂、桫椤、倥侗、蜻蜓、轰隆、当啷、惝恍、魍魉、缥缈、飘渺、耷拉等。 C.非双声叠韵联绵字:如蜈蚣、蓊郁、珊瑚、疙瘩、蚯蚓、惺忪、铃铛、奚落、褡裢、茉莉、蚂螂、窟窿、伉俪、蝴蝶、笊篱、蹦达、蟪蛄、狡狯、狡猾、蛤蚧、蛤蜊、牡丹、磅礴、提溜等。 D.外来词,由汉语以外的其他语种音译过来的词语。如干部、涤纶、甲克(夹克)、的士、巴士、尼龙、吉普、坦克、芭蕾、哒爹等。 E.专用名词,主要是地名、人和事物名称。如纽约、巴黎、北京、苏轼、李白、孔子、萝卜、菠菜、番茄、红薯等。 ③多音节语素,主要是拟声词、专用名词和音译外来词。如:喜马拉雅、珠穆朗玛、安迪斯、法兰克福、奥林匹克、白兰地、凡士林、噼里啪啦、淅淅沥沥、马克思主义、中华人民共和国 词 二.词和词的分类。 词是由语素组成的最小的造句单位。 (“单位”是名词类。) 从构成方式来看,可以分成: ①单纯词:由一个语素组成的词,自由的单音节语素和所有的双音节、多音节语素都可以组成单纯词。如:山、水、天、地、人、有、土、红、凑;仿佛、苍茫、蜈蚣、琉璃、参差、蹉跎;敌敌畏、阿司匹林、萨克斯、麦克风等。 ②合成词:由两个或两个以上的语素组成的词。 词法分析器实验报告 词法分析器设计 一、实验目的: 对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状 态转换图设计词法分析器的基本方法。利用该词法分析器完成对源程 序字符串的词法分析。输出形式是源程序的单词符号二元式的代码, 并保存到文件中。 二、实验内容: 1. 设计原理 词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。 理论基础:有限自动机、正规文法、正规式 词法分析器(Lexical Analyzer) 又称扫描器(Scanner):执行词法分析的程序 2. 词法分析器的功能和输出形式 功能:输入源程序、输出单词符号 程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符,界符 3. 输出的单词符号的表示形式: 单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号各一种。 4. 词法分析器的结构 单词符号 5. 状态转换图实现 三、程序设计 1.总体模块设计 /*用来存储目标文件名*/ string file_name; /*提取文本文件中的信息。*/ string GetText(); /*获得一个单词符号,从位置i开始查找。并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。*/ string GetWord(string str,int i,int& j); /*这个函数用来除去字符串中连续的空格和换行 int DeleteNull(string str,int i); /*判断i当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string str,int i); /*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i); 汉语语法基础知识 词类和词性 (一)知识概述 词类是指词在语法上的分类,也就是把汉语里的所有词,根据它们的词汇意义和语法特点进行分类,这样得出的结果就是词类。现代汉语教学系统把词分为十二类: 实词可以分为: 1、名词:表示人或事物名称的词叫名词。 (1)表示人:老师、学生、作家、工人、鲁迅 (2)具体事物:天、地、花、草、天空、海洋 (3)抽象概念:方法、科学、法律、事业 (4)处所:北京、青岛、黄河、长江、三味书屋 (5)方位:东、西、南、北、上、下、前、后、左、右、里、外、内、中、间、旁、以前、以南、之下、之后、东边、西面、里头。 (6)时间:早晨、正午、晚上、半夜、上午、白天、夏天、立秋、今天、星期二 2、动词:表示动作行为、发展变化、心理活动等意义的词叫动词。 (1) 动作行为:穿、跳、走、纪念、朗诵。 (2) 存在变化:有、增加、缩小、扩大、发生。 (3) 心理活动:想、懊悔、喜欢、担心。 (4) 可能意愿:应该、应当、能够、愿意、必须、敢、肯、会、能、要、可以。 (5) 趋向:上、下、来、去、上去、下去、进来、进去、起来、上来。 (6) 判断:是、就是、正是 (7) 使令:使、让、派、请、叫、要求、命令、推举、允许、鼓动、鼓励。 3、形容词:表示事物的形状、性质或状态的词叫形容词。 (1)形状:大、小、高、圆、长、短、高大、肥胖。 (2)性质:好、坏、镇定、勇敢、乐观、伟大、优秀 (3)状态:愉快、慌张、急躁、迅速、朦胧、桔红 4、数词:表示数目的词叫数词。 (1)基数(确数)一、二、千、万、亿 (2)序数:第一、三叔、三年级、六楼、初五、老三。 (3)分数:三分之一、九成 (4)倍数:三倍、十倍、翻一番 (5)概数:十几概数、十余人、三十多岁、两三个、成千上万、很多人 5、量词:表示事物单位或行为、动作单位的词叫量词。 无量(表示人或事物单位的词) (1)个体:个、位、尺、只、台、条 (2)集体:批、帮、群、套、双、副、对、类 (3)不定量:些、点 (4)度量衡:丈、尺、里、亩 动量(表示动作行为的单位)次、回、下、趟、遍、阵、场、遭、焉 动量词也可以借用跟动作有关的事物的名词。如:画一笔、切一刀、工作一星期、学习一下午、踢一脚、送一车 说明:在现代汉语中,数词本身只表示抽象的数的概念,在计算事物或动作的数量时,数词的后面必须加上量词。数词跟量词连用就是数量词。 6、代词:具有指示、代替作用的词叫代词。代词可分为人称代词、指示代词、疑问代词。 ⑴人称代词:代替人或事物的名称的代词。 理工大学信息工程与自动化学院学生实验报告 (2012 —2013学年第一学期) 一、实验目的及容 编译技术是理论与实践并重的课程,而其实验课要综合运用所学的多门课程的容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 调试并完成一个词法分析程序,加深对词法分析原理的理解。 二、实验原理及基本技术路线图(框原理图或程序流程图) 1、待分析的简单语言的词法 (1)关键字: begin if then while do end 所有关键字都是小写。 (2)运算符和界符: := + –* / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码 3、词法分析程序的功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 二、所用仪器、材料(设备名称、型号、规格等或使用软件) 1台PC以及VISUAL C++6.0软件。 三、实验法、步骤(或:程序代码或操作过程) (1)程序代码: #include 实验二:词法分析 一、实验目的:编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词, 即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及 Error”,然后跳过错误部分继续显示) 二、估计实验时间:1.课余准备15小时;2.上机二次4小时;3.完成实验报告5小时。 三、实验过程和指导: (一)准备:1.阅读课本有关章节,花一周时间明确语言的语法,写出基本保留字、标识符、 常数、运算符、分隔符和程序例。2.初步编制好程序。3.准备好多组测试数据。 (二)上课上机:将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求:Array程序输入/输出示例: 如源程序为C语言。输入如下一段: main() { int a,b; a = 10; b = a + 20; } 要求输出如右图。 要求: 识别保留字:if、int、for、while、do、return、break、 其他的都识别为标识符; 常数为无符号整形数; 运算符包括:+、-、*、/、=、>、<、>=、<=、!= 分隔符包括:,、;、{、}、(、) 程序思路(仅供参考): 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将源程序全部输入到字符缓冲区中。 2.取单词前:去掉多余空白。 3.取单词后:去掉多余空白(可选,看着办)。 4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?) 5.显示结果。 (四)练习该实验的目的和思路: 程序开始变得复杂起来,可能是大家以前编过的程序中最复杂的,但相对于以后的程序来说还是简单的。因此要认真把握这个过渡期的练习。程序规模大概为200行。本实验和以后的实验相关。通过练习,掌握对字符进行灵活处理的方法。 (五)为了能设计好程序,主意以下事情: 1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。 2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。 3.编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 四、上交: 1.程序源代码; 中文语法 语法是语言组合的规律和法则。汉语语法分析可以按由小到大分为五级单位,即语素(字)、词、短语、句子、句群。 二、为什么要学习语法 为了掌握语言的组合规律、规则,提高理解语言的、运用语言的能力。 第一节、词类 一、实词和虚词 词是由语素(字)构成的。词按语法功能和语法意义可分为实词和虚词。 实词是有实在意义的词,它可分为:名词、动词、形容词、数词、量词、代词等六类。 虚词是没有实在意义的词,它可为副词、介词、连词、助词、叹词、拟声词等六类。 二、名词 名词是表示人或事物名称的词。 1、普通名词:牛、人、学生、云、飞机、菜 2、专有名词:中国、黄河、泰山、毛泽东 3、抽象名词:精神、文化、人生、思想 4、时间名词:现在、去年、明天、星期一 5、方位名词:上、前、东、夏天、以上、之南、之东、一旁、底下、跟前、当中、里外、左右、上下 三、动词 动词是表示动作、行为、存在、变化、心理活动等意义的词。 1、表示动作行为:看、听、笑、唱、跳、飞、劳动、研究、认识、安慰、团结、休息 2、表示心理活动:爱、恨、怕、想、希望、喜欢、回忆、思考、理解、厌恶 3、表示发展变化:增加、扩大、提高、降低 4、表示存在、出现、消失:存在、出现、消失、死亡、停、丢 5、表示使令:叫、让、派、请、使、要求、命令、禁止、 6、表示可能、意愿——能愿动词:能、能够、会、可以、可能、应该、应当、必须、要、愿意、需要、肯、敢、情愿 7、表示动作趋向——趋向动词:上、下、来去、进、出、过、起来、回去 8、表示判断——判断词:是 四、形容词 形容词是表示人、事物的形状、性质或者动作、行为、发展、变化状态的词。 1、表示形状:大、小、圆、粗、滑、平、高、低、宽、窄、肥、胖、美、丑、温柔、平缓、笔直 2、表示性质:好、坏、冷、热、酸、甜、苦、软、聪明、朴素、老实、正确、勇敢、特殊 3、表示状态:快、忙、急、稳、轻松、高兴 五、数词 数词是表示数目的词。数词可分为基数、序数、分数、小数、倍数和概数。 1、基数:一、二、三、……十、百、千、万、亿 2、序数:第一…头一回、初一…老大…老幺 3、分数、25?、几分、几成 4、小数:0?2 5、12?34 5、倍数:一倍… 6、概数:几、两、来、多、把、左右、上下、以上、以下、成千、上万、近亿、三四个、两三年 简单词法分析器 1、将源文件中的单词识别出来,以用'$'为首的标识符标记识别出的单词 2、单词符号及内部表示如表: 单词符号种别编码助记符内码值 DIM 1 $DOM — IF 2 $IF — DO 3 $DO — STOP 4 $STOP — END 5 $END — 标识符 6 $ID 内部字符串 常数7 $INT 标准二进制形式= 8 $ASSIGN — + 9 $PLUS — * 10 $STAR — ** 11 $POWER — ; 12 $SEMICOLON — { 13 $LBRACE — } 14 $RBRACE — /* * 词法分析:将源文件中的单词符号一一识别 * 并将其与助记符保存到文本文件 */ #include "iostream" #include "string" using namespace std; //reserve保留字 string reserve[5] = {"DIM","IF","DO","STOP","END"}; //结构体数组,保存已识别的单词 struct table { string str; string name; }table[400]; int count = 0; //判断是否为保留字 bool Reserve(string str) { bool flag = false; for(int i=0; i 《词法分析》设计说明书 学生姓名 学 号 5011110122 5011110133 5011110128 所属学院 信息工程学院 专 业 计算机科学与技术 班 级 计算机15-1班 信息工程学院 《编译原理及实践》结课大作 业 摘要 编译,简单的说,就是把源程序转换为可执行程序。从hellow worl说程序运行机制里面简单的说明了程序运行的过程,以及一个程序是如何一步步变成可执行文件的。在这个过程中,编译器做了很多重要的工作。对于编译的内部实现,也就是编译的原理。 这篇论文主要说的是编译器前端,词法分析器的原理,最后会给出一个词法分析器的简单实现。 编译简单的说,就是把源程序转化为另一种形式的程序,而其中关键的部分就是理解源程序所要表达的意思,才能转化为另一种源程序。 可以用一个比喻来说明问题:人A和人B想要交谈,但是他们都不知道彼此的语言,这就需要一个翻译C,同时懂得A和B的语言。有了C做中间层,A和B才能正常交流。C的作用就有点像编译器,它必须能理解源程序所要表达的意思,才能把信息传递给另一个。编译器也一样,它的输入是语言的源文件(一般可以是文本文件)对于输入的文件,首先要分离出这个输入文件的每个元素(关键字、变量、符号、、),然后根据语言的文法,分析这些元素的组合是否合法,以及这些组合所表达的意思。 程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。 这篇论文主要说的就是词法分析,也就是把输入的符号串整理成特定的词素。 关键词:单片机;词法分析 实用中文语法 甚么是语法 语音、语义和语法是语言的三个要素,学习汉语时,语法是语言三要素内最受忽视的一环,这情况在汉人学习汉语时尤其明显。 语法,顾名思义,就是语言的法则。世界上的每一种语言,都有语素、词、短语、句子、句群这样的语言成分,这些语言成分都是按照一定的语言组合法则组织起来的,汉语当然也不例外,它的语言成分,也是由小到大逐级组合起来的。比如「棍棒」、「桌椅」这些词都是由两个实语素运用直接组合的方式组合起来的,表示的是并列的结构关系。「幸福的人生」、「残破的农庄」这些短语都是由两个实词运用关联组合的方式组合起来的,表示的是修饰和被修饰的结构关系。「计算机被爸爸修好了。」「防线被对方球员撕破了」。这些「被」字句都是按照「谁被谁怎么样了」这样的组合法则组合起来的。从上面的简单分析中不难看出,各种语言成分的组合都有一定的法则,这些语言成分的组合法则就是语法。 世界各种语言都有各自有它本身的特定组合法则,这些法则并不是由某位天才的语法学家凭丰富的想象创造出来的,它是由使用这种语言的人们在长期的语言应用中形成的,是大家共同理解、共同遵守、约定俗成的。如果哪一个人非要违背这种语言法则,那么,他说出来的话,写出来的文章,别人就无法理解的接受,这种语言就会变成废物。 由于世界上各种语言的发展历史不同,所处的地域不同,语言的特点不同,所使用的语法手段不同等等,所以各种语言的组合法则也会不同。例如: 汉语属于分析型语言,所谓分析型语言,就是这种语言的字词本身大多没有固定的语法特性,它的语法特性只有分析句子含意时才得以揭露,试以下面句子为例: 姊姊昨天饮了一罐芦荟汁。 她怀疑昨晚的腹泻是由这罐饮料引起。 同一个「饮」字,在第一句时是作为动词使用,在第二句时却是作为形容词使用,虽然字词在语法的性质有所不同,但形态却极少改变,它的语法关系主要靠语序(即词语在句子中的位置)和虚词等语法手段来表示。汉语是靠各级语言单位根据一定的语言法则逐级组合起来的,整体而言,汉语的词形态变化较少,在各类词中,虽然也有一部分语法范畴,但不象富于形态变化的语言那样普遍,所以,同一个词兼属几个词类的现象很普遍。在句法方面,词序是最重要的语法手段。词和词的结合比较自由。虚词也是汉语重要的语法手段,它在词法和句法中都起着重要的 词法分析器的实现 开篇 编译,简单的说,就是把源程序转换为可执行程序。从hello world 说程序运行机制里面简单的说明了程序运行的过程,以及一个程序是如何一步步变成可执行文件的。在这个过程中,编译器做了很多重要的工作。对底层该兴趣的我,自然的,也就迫切想搞清楚编译的内部实现,也就是编译的原理。 这篇文章主要说的是编译器前端,词法分析器的原理,最后会给出一个词法分析器的简单实现。 介绍 编译简单的说,就是把源程序转化为另一种形式的程序,而其中关键的部分就是理解源程序所要表达的意思,才能转化为另一种源程序。 可以用一个比喻来说明问题:人A和人B想要交谈,但是他们都不知道彼此的语言,这就需要一个翻译C,同时懂得A和B的语言。有了C做中间层,A和B才能正常交流。C的作用就有点像编译器,它必须能理解源程序所要表达的意思,才能把信息传递给另一个。 编译器也一样,它的输入是语言的源文件(一般可以是文本文件)对于输入的文件,首先要分离出这个输入文件的每个元素(关键字、变量、符号、、) 然后根据语言的文法,分析这些元素的组合是否合法,以及这些组合所表达的意思。 程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。 这篇博文主要说的就是词法分析,也就是把输入的符号串整理成特定的词素。 词法分析 定义: 词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等 (1) 关键字是由程序语言定义的具有固定意义的标识符。例如,Pascal 中的begin,en d,if,while都是保留字。这些字通常不用作一般标识符。 (2) 标识符用来表示各种名字,如变量名,数组名,过程名等等。 (3) 常数常数的类型一般有整型、实型、布尔型、文字型等。 (4) 运算符如+、-、*、/等等。 (5) 界符如逗号、分号、括号、等等。 输出: 一、创建环境 1.将java拷贝到c:盘根目录下。 2.设置环境变量: 在“计算机”图标上单击右键--------属性------高级系统设置------环境变量-----系统变量 path中设置内容为: c:\java\jdk1.6.0_10\bin; classpath中设置内容为: c:\java\jdk1.6.0_10\lib\dt.jar; c:\java\jdk1.6.0_10\lib\tools.jar; c:\java\jre6\lib\rt.jar; .; c:\1000; 3.在c盘要建立1000 文件夹,将SimpleLexer文件夹复制到该文件 夹内(注意字母的大小写)。 二、词法分析 1. 运行cmd 命令 输入cmd回车 输入cd\ 回车,使输入符号到c:\> 状态 再输入cd 1000 回车。进入到c:\1000> 状态 2.编译程序 先编译Token.java文件,再编译Main.java文件,最后编译lexer.java 文件。如下图所示。 3.运行程序 test.in 是词法分析器的输入程序(即输入的源程序,此程序由学生给出)。运行后,自动在1000目录下生成result.out文件。(test.in 和result.out文件都可由记事本查看内容) test.in 文件内容如下: result.out文件内容如下: 如果test.in中输入有误,则运行时提示: 4.编译原理课程设计内容如下:(注:每个同学从下列关键字中各选 五个,从运算符中各选四个,标识符和界符都要设计) 单词符号分为关键字,标识符,运算符,界符等: 关键字:begin end if then else while do void switch catch try case for continue break default return long short int float double char abstract Boolean The的Construction 1. When can I use the 的construction? They are very good friends. (2) 的 is also used to indicate that a noun after 的 belongs to another noun or pronoun before 的. It is known as the possessive 的. This use of 的 is similar to the use of the possessive Mr. Li's book is a Chinese language book. 2. How do I form the 的 construction? The noun which is described should always be placed after 的. The description of nouns in the (1) The description can be an adverb + adjective: This is a very good sentence. (2) The description can also be a phrase or even a sentence. This construction is like an inverted relative clause sentence in English. I want to buy a copy of the book which you told me about yesterday. 汉字结构六书说 古人把汉字的造字方法归纳为六种,总称"六书",即所谓"象形、指事、会意、形声、转注、假借"。"六书"是古人根据汉字结构归纳出来的汉字构造结论,而决不是古人依照这六种法则来创造文字的。 象形、象事、象意、象声指的是文字形体结构,转注、假借指的是文字的使用方式。 东汉许慎受刘歆的启示,费几十年的精力整理汉字,编成《说文解字》一书,在这本书的"叙"说:"周礼八岁入小学,保氏教国子先以六书。" 这六种造字方法的特点,可以简介如下: 二、汉字单字词的构词法 借用形音构词法: (1)借现成的形音。“六书”中的“假借”就是这种方法。 这种借形音造词不限于上古,后世出现也很多,“简化汉字”中也有采用。下面举几个实例来证明: 1、安,《说文·宀部》云:“安,静也。从女在宀中。”这个词的初义是“安静”的意思。后来其音,形被借,造成新词:①姓。②疑问代词。相当于“哪里”或“怎么”。③安倍的简称。 2、盎,《说文·皿部》云:“盎,盆也。从皿央声。”这词的初义是“盆”一类的器皿。后来其音,形被借,造成表示“洋溢”义的一词,如用于“盎然”、“盎盎”等。 词汇由词组成,词由语素构成。汉语的语素绝大部分是单音节的。 它们不单用的时候是构词成分,单用的时候就是词。由于许多单音节语素能独立成词而语素和语素又能相当自由地复合成词,这就使汉语构词具有很大的灵活性。用复合法构成的词,人们容易理解和接受。因此汉语在历史发展中就能方便自如地创造新词,以表示不断出现的新概念,满足社会对于语言的要求。 例如“生”、“产”两个语素,它们既能单独成词,又能相互组成复合词“生产”、“产生”;同时还能个别地跟其他单音节语素组成一系列复合词,包括许多新词在内。例如:生活、生存、构词法和句法的一致汉语又缺少地道的前缀和后缀,词缀附加法在构词上不占重要地位。汉语里应用最广的构词法是词根复合法,即依照句法关系由词根组成复合词的方法,这种构词法跟由词结合为词组的造句法基本上是一致的。比如,汉语词组的主要结构类型为“偏正”、“并列”、“述宾”、“述补”、“主谓”,而复合词的构成格式也同样是这5种。 ㈡合成词 2.附加式 ⑴前缀+词根 汉语:阿姨、阿哥、老乡、老师、大娘、大叔、小李、第一、最先、外公。 ⑵词根+后缀 汉语:本子、木头、花儿、可塑性、读者、商业化、绿的、精神上、哥们儿、鼓手。中文语法的基本知识
词法分析器实验报告
(完整版)汉语语法基础知识
编译原理实验报告一 简单样本语言的词法分析器
词法分析
中文语法词性和句式
简单词法分析器
词法分析课程设计
《实用中文语法》word版
词法分析
词法分析说明
中文语法 chinese grammar “的”字用法
中文构词法