购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第2章
词法分析和语法分析

【引言故事】

词法分析和语法分析是对语言语义进行理解的基础。自古以来,中国以文字、音韵和训诂为主导的语言文字,一直是古代人文学术的重要内容。汉字从甲骨文开始的演化过程,逐渐形成了较为系统的“表意”特点,每个字都是音、形与义的综合表示。

虽然我国的汉语言未能如西方语言那样,较早地形成以语言中词法及语法组织结构为研究对象的系统性的语法学,但是,中国古代也有着严肃语法观念。中国语言学史上的语法研究早已在经典文献中得到启示。《尚书》和《周礼》等文献中,已经提及了名词和实际事物之间的关系。《论语》和《孟子》中探讨了词义的多义性和上下文的影响,而《说文解字》深入研究了汉字的构成和意义。这些文献中所包含的语法分析,也许就是中国古代语法学的雏形。在古汉语中,语法主要依赖于语序和虚词进行构建。时间先后是汉语语序中的一个重要规则,而虚词则用于表达实词之外的语法意义。在唐宋时期,中国的语法研究不仅来源于梵文佛典,还受到了阿拉伯语和波斯语语法学的影响。汉语学者们通过对这些语法理论的研究和比较,逐渐形成了自己的语法学体系。清朝时期,学者们提出语法学概念,并对句法结构有了清晰的认识,明确了根据句法结构进行训诂考据的方法。例如,基于句法规则来校勘古籍。这样的语法分析方法,使得中国的语法研究从零散走向系统。直到1957年,林守翰教授发表的《汉语语法》标志着汉语语法学的现代化,开创了汉语语法学的新时代。

语音、词汇和语法构成了对古汉语辨析的三要素 。其中,语法是组词成句的结构规律与约束,分析语法能够探求词义。而词性则不同,在不同语句中同一个词所表达的意思可能完全不同。根据上下文的语义环境和句法特点,来准确地辨析词性,将有助于准确理解语句。例如:设酒杀鸡食(出自《桃花源记》),这里的“食”为名词,意为“饭”;杀鸡为黍而食之(出自《论语·微子》),这里的“食”则为使役动词,意为“使(子路)食”。另外,词语在句子中一般都具有句法功能,而不同的句法功能,则对应着不同的词义。例如:李斯上书说,乃止逐客令(出自《秦始皇本纪》),这里的“客”充当宾语,意为“外来的人”;齐将田忌善而客待之(出自《孙子吴起列传》),这里的“客”充当状语,意为“像上宾般款待”。句法结构的分析着重于句中各部分之间的关系。即,如何通过虚词和词序这些语法手段来构成各种不同的句式。此外,在古汉语中往往存在这样的情况,几个语句所用的某些词语相同,但因句法不同而导致词义不同;而有些特殊结构的句法,更使某些词语显示出特殊的含义。例如:或王命急宣,有时朝发白帝,暮到江陵(出自《三峡》),这里的“或”,意为“如或”;为医或在齐,或在赵,在赵者名扁鹊(出自《史记·扁鹊列传》 ),这里的“或”,则意为“或者”。

闻一多先生曾在《诗经通义》的“匏有苦叶”条中提到:“背儒无语法观念,其致误往往若是”。这正说明了语法分析对确定词义的重要性。语言是一个整体,语法也不是简单的结构规律,对词性、词义和句法的辨析是对古汉语文献理解的重要组成部分。

同样地,在编译原理的学习当中,词法分析和句法分析(即语法分析)是程序编译过程中不可或缺的重要步骤,是后续语义理解和代码生成的基础。软件开发人员使用高级编程语言编写程序,使人类能够相对容易地理解程序,但计算机无法直接理解。因此,我们引入编译器将程序源代码转换为机器可以理解的形式是必要的一步,而如何分析程序源代码的词法和语法则是编译过程中的第一个步骤。

【本章要点】

词法分析是编译器工作流程中的第一个关键步骤。在该步骤中,编译器将源代码从字符流转换为词法单元序列,并输入至语法分析器中。而语法分析的主要目标是检验源代码是否符合语法规范。本章内容主要涵盖了在编译过程中进行词法分析和语法分析的过程以及关键算法。其中,重点讨论了词法分析中正则表达式的基本概念和原理,并分析了非确定的有限状态自动机和确定的有限状态自动机之间的转化和技术特点。在语法分析部分,本章介绍了上下文无关文法,以及自顶向下和自底向上两大类语法分析算法,以形成完整的编译器词法和语法分析步骤。

此外,本章中也讨论了对应的技术实践内容,在所提供的技术指导下,编写一个程序对使用C--语言书写的源代码进行词法分析和语法分析(C--语言文法参见附录A),并打印出相应的分析结果。该实践任务要求使用词法分析工具GNU Flex和语法分析工具GNU Bison,并使用C语言来完成。在这两个强大工具的帮助下,结合本章前面介绍的理论方法,编写一个能进行合理词法分析和语法分析的程序将是一件轻松愉快的事情。

需要注意的是,由于在后面的实践内容中还会用到本章中已经写好的代码,因此保持良好的代码风格、系统地设计代码结构和各模块之间的接口对于整个编译实践来讲是相当重要的。 8vw3I9RSK0meNqaTz13GlvukyLToAuFQwHkScV1Uy5I7CBhzMBZISvPiQb5rIZ0c

【思维导图】
点击中间区域
呼出菜单
上一章
目录
下一章
×