📜  编译器设计-词法分析

📅  最后修改于: 2021-01-18 05:23:54             🧑  作者: Mango


词法分析是编译器的第一阶段。它从以句子形式编写的语言预处理器中获取修改后的源代码。词法分析器通过删除源代码中的任何空格或注释,将这些语法分解为一系列标记。

如果词法分析器发现令牌无效,则会生成错误。词法分析器与语法分析器紧密合作。它从源代码读取字符流,检查合法令牌,并在需要时将数据传递给语法分析器。

令牌在编译器中传递

代币

词素被称为令牌中的字符序列(字母数字)。对于每个词素,都有一些预定义的规则被标识为有效令牌。这些规则由语法规则通过模式定义。模式解释了什么可以是令牌,并且这些模式是通过正则表达式定义的。

在编程语言中,关键字,常量,标识符,字符串,数字,运算符和标点符号可以视为标记。

例如,在C语言中,变量声明行

int value = 100;

包含令牌:

int (keyword), value (identifier), = (operator), 100 (constant) and ; (symbol).

代币规格

让我们了解语言理论如何遵循以下术语:

字母

符号的任何有限集合{0,1}是一组二进制字母{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}是一组十六进制字母,{az,AZ}是一组英语字母。

弦乐

任何有限的字母序列都称为字符串。字符串的长度是出现字母的总数,例如,字符串tutorialspoint的长度为14,用| tutorialspoint |表示。 =不具有字母14.一种字符串,即零长度的字符串被称为一个空字符串,并且由ε(ε)表示。

特殊符号

典型的高级语言包含以下符号:

Arithmetic Symbols Addition(+), Subtraction(-), Modulo(%), Multiplication(*), Division(/)
Punctuation Comma(,), Semicolon(;), Dot(.), Arrow(->)
Assignment =
Special Assignment +=, /=, *=, -=
Comparison ==, !=, , >=
Preprocessor #
Location Specifier &
Logical &, &&, |, ||, !
Shift Operator >>, >>>, <

语言

语言被认为是有限的一组字母上的有限的字符串。计算机语言被视为有限集,并且可以对它们执行数学上的设置操作。可以使用正则表达式来描述有限的语言。

最长匹配规则

当词法分析器读取源代码时,它将逐字母扫描代码;当遇到空格,运算符符或特殊符号时,它决定单词已完成。

例如:

int intvalue;

在扫描两个词素直到’int’时,词法分析器无法确定它是关键字int还是标识符int值的缩写。

最长匹配规则指出,应根据所有可用令牌中的最长匹配来确定扫描的词位。

词法分析器还遵循规则优先级,其中语言的保留字(例如关键字)的优先级高于用户输入。也就是说,如果词法分析器找到与任何现有保留字匹配的词素,则它会产生错误。