返回
多位数字与空白符:词法分析揭秘编译原理
开发工具
2023-09-06 00:53:14
对于编译原理初学者来说,我们一开始都会约定表达式中只包含个位数的数字,以便快速入门。然而,现在是时候打破这个限制,让我们的编译器支持多位数的数字了。
而要支持多位数的数字,就离不开一个新的步骤——词法分析。通俗地说,词法分析就是将一段完整的语句拆分成一个个的词(token),以便之后进行进一步的语法分析。
举一个简单的例子:今天真热 ,这句中文语句在经过词法分析后,会被拆分成以下几个词:今天 、真 、热 。这些词就是我们进行语法分析的基本单位。
对于编译器来说,它需要对源程序进行词法分析,将源程序拆分成一个个词。词可以是(如 if 、else )、标识符(如变量名、函数名)、常量(如数字、字符串)和符号(如 + 、- 、() )。
词法分析通常由一个词法分析器(也被称为扫描器或词法扫描器)来完成。词法分析器的输入是源程序,输出是一系列词。
为了支持多位数的数字,我们的词法分析器需要能够识别数字字符序列。我们可以定义一个正则表达式来匹配数字字符序列,如:
[0-9]+
这个正则表达式表示连续的一个或多个数字字符。当词法分析器遇到一个数字字符序列时,它就会将它识别为一个数字词。
除了识别数字字符序列之外,词法分析器还需要能够识别空白符。空白符包括空格、制表符和换行符。词法分析器会跳过空白符,而不会将它们识别为词。
通过词法分析,我们可以将源程序拆分成一个个词,为后续的语法分析奠定了基础。
下面是一个使用词法分析来处理多位数字和空白符的简单例子:
public class LexicalAnalyzer {
public static List<Token> lex(String source) {
List<Token> tokens = new ArrayList<>();
int index = 0;
while (index < source.length()) {
char c = source.charAt(index);
if (Character.isDigit(c)) {
int number = 0;
while (Character.isDigit(source.charAt(index))) {
number = number * 10 + (source.charAt(index) - '0');
index++;
}
tokens.add(new Token(TokenType.NUMBER, number));
} else if (Character.isWhitespace(c)) {
index++;
} else {
tokens.add(new Token(TokenType.OTHER, c));
index++;
}
}
return tokens;
}
}
这个代码展示了如何使用词法分析来识别多位数字和空白符。词法分析器将源程序拆分成一个个词,然后将这些词存储在一个列表中。这些词随后可以被语法分析器用于进一步分析。