词法分析
- 格式:docx
- 大小:244.81 KB
- 文档页数:7
现代汉语语法的五种分析方法一、词法分析方法词法分析方法主要研究汉语中各种词类的构成、意义和用法,以及单词的形态变化规律。
它通过对词类、构词法、词义、词型变化规律等的研究,分析单词的构造和使用规律,从而理解句子的结构和语言表达的方式。
词法分析方法是语法研究最基本的方法,是其他语法方法的基础。
二、句法分析方法句法分析方法主要研究汉语中句子的构成、句子成分的排列顺序、句子结构的范式以及句子在语言中的功能等问题。
通过句法分析可以揭示句子的各个成分之间的关系,以及句子的内部结构和语序的规律。
句法分析方法主要包括短语结构语法分析和依存句法分析两种。
三、语义分析方法语义分析方法主要研究汉语中的词义、句义以及上下文对语义的影响等问题。
通过对词汇的义项、义体系的分类和构建、句子的义理解析等研究,揭示语言表达中的含义和信息传递方式。
语义分析方法可以帮助理解句子的意义和人们在交流中的意图。
四、语用分析方法语用分析方法主要研究汉语中语言行为和交际行为的规律,包括语言行为的目的、意图、社会因素对语言行为的影响,以及话语之间的关系和交际规则等。
通过语用分析可以了解句子的使用背景、语言行为的目的以及说话人的意图等,从而准确地理解和使用语言。
五、文体分析方法文体分析方法主要研究汉语的不同文体在语法和语言表达上的差异和特点。
它通过对文体的特征、结构和语言风格等的研究,揭示不同文体的特点和使用规律。
文体分析方法可以帮助我们理解不同文体的表达方式,从而提高我们在不同场合中的语言运用能力。
总之,这五种分析方法可以相互协作,可以全面地揭示汉语语法的各个方面,帮助我们更好地理解和使用汉语。
自然语言处理中的词法分析与句法分析词法分析(Lexical Analysis)是指将一个句子或文本切分成一个个独立的词(Token)的过程。
在自然语言处理中,词法分析主要包括以下几个步骤:1.分词(Tokenization):将文本切分成词。
例如,将句子“我爱自然语言处理”切分成["我", "爱", "自然语言处理"]。
分词可以使用规则、统计方法或机器学习方法进行。
2.词性标注(Part-of-Speech Tagging):为每个词标注其词性。
例如,将词语“自然语言处理”标注为“名词短语”,将词语“爱”标注为“动词”。
词性标注可以使用规则、统计方法或机器学习方法进行。
3.词形还原(Lemmatization):将每个词还原为其基本形式。
例如,将动词的各种时态和语态还原为原形。
词形还原通常使用规则或基于词典的方法。
句法分析(Syntactic Analysis)是指对一个句子的结构进行分析,包括短语结构分析和依存关系分析。
句法分析的目标是确定句子中各词之间的语法关系。
在自然语言处理中,句法分析主要包括以下几个步骤:1.短语结构分析(Phrase Structure Parsing):根据语法规则,将句子分解成短语(Phrase)。
短语结构分析可以使用基于规则的方法(如上下文无关文法)或基于统计的方法(如基于机器学习的方法)。
2.依存关系分析(Dependency Parsing):确定句子中词与词之间的依存关系。
依存关系表示词与词之间的句法关系,如主谓关系、动宾关系等。
依存关系分析可以使用基于规则的方法或基于统计的方法。
词法分析和句法分析是自然语言处理中两个重要的步骤。
词法分析解决了单词划分和词性标注的问题,为后续的句法分析提供了基本的信息。
句法分析则进一步对句子的结构和语法关系进行了深入分析,为理解句子的意义和进行更高级的语义分析奠定了基础。
1.词法分析分为三部分学习:(1)词法分析程序的设计(2)词法分析器的手工构造(3)词法分析程序的自动构造工具(LEX)词法分析有双重含义:(1)立法:规定单词形成的规则(2)执法:根据构词规则识别输入序列2.词法分析程序的功能:源程序——词法分析器——单词序列扫描器的任务:(1)组织源程序的输入(2)识别单词,转化为内部表示(3)删除注释、空格及无用符号(4)查填符号表(5)检查词法错误3.程序语言单词的分类:(1)关键字(保留字)(2)标识符:用来表示各种名字(3)字面常数(字面量)要区别字面量与常量(4)运算符(5)分界符4.词法分析器的输出(词类编码,单词自身的属性值)词法分析输出的是TOKEN字,并填写符号表,TOKEN和符号表示不同的。
因此,一般将词法分析器识别出的序列称为记号流。
源程序——>词法分析——>符号表、TOKEN字、错误信息词类编码原则:关键字一字一码:常数一类一码;标识符一类一码;界符和算符一符一码。
关键字、算符、界符,它们的此类编码就可以表示其完整的信息,因此其单词自身属性为空。
对于标识符,属性填符号表的入口指针;对常数,属性填常数表的入口指针。
5.词法分析器有三种工作方式:P17(1)作为语法分析器的子程序(2)词法分析器进行单独的一遍扫描(3)与语法分析器并行工作:上述两种均是串行工作方式,效率不够高。
改让词法分析器和语法分析器以生产\消费的形式并行工作(队列,流水线的方式工作)。
6.为了构造词法分析器,要研究构词法,每种词类的构词模式,识别它的数学模型——有穷自动机。
7.手工构造识别单词的DFA:对于每一种单词(关键字,标识符,整数)都要分别构造识别其的DFA。
编写词法分析程序:根据画出的状态转换图构造词法分析程序,每个状态对应一段程序,完成到达此状态的工作;词法分析程序的控制程序模拟状态转换图的状态转换。
8.单词的结构用正规式描述:9.正规式——>NFA——>DFA——>min DFA用LEX建立词法分析程序的过程:LEX源程序lex.l——>LEX编译器——>Lex.yy.c——>C编译器——>a.out输入流——> a.out——>单词序列10.产生和识别单词的规则称为模式按照某个规则或模式识别出的元素称为记号(token)而单词是指被识别出的元素自身的值11.词法分析器是编译器中唯一与源程序打交道的部分,可以认为是整个编译器的预处理器。
戴新宇南京大学计算机科学与技术系Outline词法分析的作用词法单元的规约(正则表达式) 词法单元的识别(状态转换图) 有穷自动机词法分析器生成工具及设计词法分析器作用词法分析是读入源程序的输入字符、将它们组成词素,生成并输出一个词法单元序列,每个词法单元对应于一个词素。
常见的做法是:由语法分析器调用,需要的时候不断读取、生成词法单元可以避免额外的输入输出在识别出词法单元之外,还会完成一些不需要生成词法单元的简单处理,比如删除注释、将多个连续的空白字符压缩成一个字符等。
词法分析和语法分析通常,将编译过程的分析划分成两个阶段的原因: 简化编译器的设计,任务分解提高编译器的效率增强编译器的可移植性词法分析相关概念词法单元(Token):包含单元名(Token-name)和可选的属性值(attribute-value) 单元名是表示某种词法单位抽象符号。
语法分析器通过单元名即可确定词法单元序列的结构。
词素(Lexeme)源程序中的字符序列,它和某类词法单元的模式匹配,被词法分析器识别为该词法单元的实例。
模式(Pattern)词法单元的词素可能具有的形式。
可以用正则表达式来表示。
词法单元示例词法单元的属性一个模式匹配多个词素时,必须通过属性来传递附加的信息。
属性值将被用于语义分析、代码生成等阶段。
不同的目的需要不同的属性。
因此,属性值通常是一个结构化数据。
词法单元id的属性词素、类型、第一次出现的位置、…词法单元示例(名和属性值)词法分析器的构造实现两种方法:基于词法单元的词法结构图或其它描述,手工编写代码扫描输入中的每个词素,并返回识别到的词法单元信息。
使用词法分析器生成工具(如lex flex)。
给出描述词素的模式,利用工具编译为具有词法分析器功能的代码。
高效且简单。
正则表达式一种描述词素模式的重要表示方法Outline词法分析的作用词法单元的规约(正则表达式) 词法单元的识别(状态转换图) 有穷自动机词法分析器生成工具及设计相关概念字母表:一个有限的符号集合二进制{0,1}ASCIIUnicode典型的字母表包括字母、数位和标点符号串:字母表中符号组成的一个有穷序列 串s的长度|s|空串ε,长度为0的串语言:给定字母表上一个任意的可数的串的集合 语法正确的C程序的集合,英语,汉语相关概念(2)和串有关的术语(banana)前缀:从串的尾部删除0个或多个符号后得到的串。
词法分析器的实现开篇编译,简单的说,就是把源程序转换为可执行程序。
从hello world 说程序运行机制里面简单的说明了程序运行的过程,以及一个程序是如何一步步变成可执行文件的。
在这个过程中,编译器做了很多重要的工作。
对底层该兴趣的我,自然的,也就迫切想搞清楚编译的内部实现,也就是编译的原理。
这篇文章主要说的是编译器前端,词法分析器的原理,最后会给出一个词法分析器的简单实现。
介绍编译简单的说,就是把源程序转化为另一种形式的程序,而其中关键的部分就是理解源程序所要表达的意思,才能转化为另一种源程序。
可以用一个比喻来说明问题:人A和人B想要交谈,但是他们都不知道彼此的语言,这就需要一个翻译C,同时懂得A和B的语言。
有了C做中间层,A和B才能正常交流。
C的作用就有点像编译器,它必须能理解源程序所要表达的意思,才能把信息传递给另一个。
编译器也一样,它的输入是语言的源文件(一般可以是文本文件)对于输入的文件,首先要分离出这个输入文件的每个元素(关键字、变量、符号、、)然后根据语言的文法,分析这些元素的组合是否合法,以及这些组合所表达的意思。
程序设计语言和自然语言不一样,都是用符号来描述,每个特定的符号表示特定的意思,而且程序设计语言是上下文无关的。
上下文无关就是某一个特定语句所要表达的意思和它所处的上下文没有关系,只有它自身决定。
这篇博文主要说的就是词法分析,也就是把输入的符号串整理成特定的词素。
词法分析定义:词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。
单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等(1) 关键字是由程序语言定义的具有固定意义的标识符。
例如,Pascal 中的begin,en d,if,while都是保留字。
这些字通常不用作一般标识符。
(2) 标识符用来表示各种名字,如变量名,数组名,过程名等等。
(3) 常数常数的类型一般有整型、实型、布尔型、文字型等。
(4) 运算符如+、-、*、/等等。
(5) 界符如逗号、分号、括号、等等。
输出:词法分析器所输出单词符号常常表示成如下的二元式:(单词种别,单词符号的属性值)单词种别通常用整数编码。
标识符一般统归为一种。
常数则宜按类型(整、实、布尔等)分种。
关键字可将其全体视为一种。
运算符可采用一符一种的方法。
界符一般用一符一种的方法。
对于每个单词符号,除了给出了种别编码之外,还应给出有关单词符号的属性信息。
单词符号的属性是指单词符号的特性或特征。
示例:比如如下的代码段:while(i>=j) i--经词法分析器处理后,它将被转为如下的单词符号序列:<while, _><(, _><id, 指向i的符号表项的指针><>=, _><id, 指向j的符号表项的指针><), _><id, 指向i的符号表项的指针><--, _><;, _>词法分析分析器作为一个独立子程序词法分析是编译过程中的一个阶段,在语法分析前进行。
词法分析作为一遍,可以简化设计,改进编译效率,增加编译系统的可移植性。
也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。
词法分析器设计输入、预处理词法分析器工作的第一步是输入源程序文本。
在许多情况下,为了更好地对单词符号识别,把输入串预处理一下。
预处理主要滤掉空格,跳过注释、换行符等。
超前搜索词法分析过程中,有时为了确定词性,需超前扫描若干个字符。
对于FORTRAN 语言,关键字不作为保留字,可作为标识符使用,空格符号没有任何意义。
为了确定词性,需超前扫描若干个字符。
在FORTRAN中1 DO99K=1,102 IF(5.EQ.M) I=103 DO99K=1.104 IF(5)=55这四个语句都是正确的语句。
语句1和2 分别是DO和IF语句,语句3和4是赋值语句。
为了正确区别1和3,2和4语句,需超前扫描若干个字符。
1 DO99K=1,102 IF(5.EQ.M) I=103 DO99K=1.104 IF(5)=55语句1和3的区别在于符号之后的第一个界符:一个为逗号,另一个为句末符。
语句2和4的主要区别在于右括号后的第一个字符:一个为字母,另一个为等号。
为了识别1、2中的关键字,必须超前扫描多个字符。
超前到能够肯定词性的地方为止。
为了区别1和3,必须超前扫描到等号后的第一个界符处。
对于语句2、4来说,必须超前扫描到与IF后的左括号相对应的那个右括号之后的第一个字符为止。
状态转换图词法分析器使用状态转换图来识别单词符号。
状态转换图是一张有限方向图。
在状态转换图中,有一个初态,至少一个终态。
其中0为初态,2为终态。
这个转换图识别(接受)标识符的过程是:从初态0开始,若在状态0之下输入字符是一个字母,则读进它,并转入状态1。
在状态1之下,若下一个输入字符为字母或数字,则读进它,并重新进入状态1。
一直重复这个过程直到状态1发现输入字符不再是字母或数字时(这个字符也已被读进)就进入状态2。
状态2是终态,它意味着到此已识别出一个标识符,识别过程宣告终止。
终态结上打个星号意味着多读进了一个不属于标识符部分的字符,应把它退还给输入口中。
如果在状态0时输入字符不为“字母”,则意味着识别不出标识符,或者说,这个转换图工作不成功。
正规表达式与正规集正规表达式是说明单词的一种重要的表示法(记号),是定义正规集的工具。
在词法分析中,正规表达式用来描述标示符可能具有的形式。
定义(正规式和它所表示的正规集):设字母表为S,1. e和Ø都是S上的正规式,它们所表示的正规集分别为{e}和{ };2. 任何aÎS,a是S上的一个正规式,它所表示的正规集为{a};3. 假定U和V都是S上的正规式,它们所表示的正规集分别为L(U)和L(V),那么,(U), U|V, U·V, U*也都是正规式,它们所表示的正规集分别为L(U), L(U)ÈL(V), L(U)L(V)和(L(U))*;4. 仅由有限次使用上述三步骤而定义的表达式才是S上的正规式,仅由这些正规式所表示的字集才是S上的正规集。
正规式的运算符的“½”读为“或” ,“· ”读为“连接”;“*”读为“闭包”(即,任意有限次的自重复连接)。
在不致混淆时,括号可省去,但规定算符的优先顺序为“(”、“)”、“*”、“· ”、“½” 。
连接符“· ”一般可省略不写。
“*”、“· ”和“½” 都是左结合的。
例令S={a,b},S上的正规式和相应的正规集的例子有:正规式正规集a {a}a½b {a,b}ab {ab}(a½b)(a {aa,ab,ba,bb}a * {e ,a,a, ……任意个a的串}ba* {b, ba, baa, baaa, …}(a½b)* {e ,a,b,aa,ab ……所有由a和b组成的串}(a½b)*(aa½bb)(a½b)* {S*上所有含有两个相继的a或两个相继的b组成的串}定理:若两个正规式U和V所表示的正规集相同,则说U和V等价,写作U=V。
证明b(ab)*=( ba)*b证明:因为L(b(ab)*)={b}{e, ab, abab, ababa b, …}={b, bab, babab, bababab, …}L((ba)*b) ={e, ba, baba, bababa, …}{b}={b, bab, babab, bababab, …}= L(b(ab)*)所以, b(ab)*=( ba)*b设U,V,W为正规式,正规式服从的代数规律有:(1) U½V=V½U (交换律)(2) U½(V½W)=(U½V)½W (结合律)(3) U(VW)=(UV)W (结合律)(4) U(V½W)=UV½UW (V½W)U=VU½WU (分配律)(5) eU=U e=U分析器的简单实现上文主要介绍了词法分析的一些相关的知识,而对词法分析器的具体实现还没有具体提到,为了能更好的理解词法分析,我写了一个简单的词法分析器。
虽然说是语法分析器,但实现的功能很简单,只是对输入的程序把注释去掉,其中用到了上面关于状态转换图部分的知识。
分析:一般的程序设计语言,注释部分的形式为;/* 注释部分、、、、*/我们的程序总是顺序的一个一个字符读取输入文件的。
我们的目的是把注释部分去掉,那么对于输入的字符流,我们只要识别出“/*”就知道后面的部分是注释部分,直到识别输入流中出现"*/"为止。
对字符流的处理是一个一个进行的,每读入一个字符,就判断,如果字符是“/”,就说明后面的部分可能是注释,再看下一个输入字符,如果是“*”, 就是上面所说的情况:“ /*”那么后面的部分就是注释部分,然后再用相同的方法找出"*/"就可以了。
这个识别的过程就可以用状态转换图来清晰的表示:对于读入的每个符号都要进行判断,如果是“/”说明后面的部分有可能是注释,进入状态1。
如果后面的输入是“*”那么就可以确定以后的内容为注释内容,如果后面的输入不是"*",说明后面的内容不是注释,前面出现的"/"可能是做除号使用,如“5/3”其实上面的流程图也就对应了程序实现的逻辑,可以用switch-case 来实现,对于每个输入,判断后跳转到相应的状态,然后继续判断。
下面是程序伪代码:while((ch=getchar())!=EOF)switch(state)case 1 :if ch=="/",state=2,break;case 2: if ch=="*",state=3else state=1;break;case 3:..........case 4:..........词法分析器这个程序比较简单,就不给出源代码了。
接下来是一个简单的词法分析器的代码,可以实现对关键字(如while end if 等),对数字的识别,去掉空格符等。
下面是这个分析器的功能:1、待分析的简单语言的词法(1)关键字:begin if then while do end所有关键字都是小写。
(2)运算符和界符::= + –* / < <= <> > >= = ; ( ) #(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter| digit)*NUM=digit digit *(4)空格由空白、制表符和换行符组成。