返回

多位数字与空白符:词法分析揭秘编译原理

开发工具

对于编译原理初学者来说,我们一开始都会约定表达式中只包含个位数的数字,以便快速入门。然而,现在是时候打破这个限制,让我们的编译器支持多位数的数字了。

而要支持多位数的数字,就离不开一个新的步骤——词法分析。通俗地说,词法分析就是将一段完整的语句拆分成一个个的词(token),以便之后进行进一步的语法分析。

举一个简单的例子:今天真热 ,这句中文语句在经过词法分析后,会被拆分成以下几个词:今天 。这些词就是我们进行语法分析的基本单位。

对于编译器来说,它需要对源程序进行词法分析,将源程序拆分成一个个词。词可以是(如 ifelse )、标识符(如变量名、函数名)、常量(如数字、字符串)和符号(如 +-() )。

词法分析通常由一个词法分析器(也被称为扫描器或词法扫描器)来完成。词法分析器的输入是源程序,输出是一系列词。

为了支持多位数的数字,我们的词法分析器需要能够识别数字字符序列。我们可以定义一个正则表达式来匹配数字字符序列,如:

[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;
    }
}

这个代码展示了如何使用词法分析来识别多位数字和空白符。词法分析器将源程序拆分成一个个词,然后将这些词存储在一个列表中。这些词随后可以被语法分析器用于进一步分析。