RE:从零开始的编译器编写 04 词法分析(3) 木灵的炼金工作室

词法分析器

我们继续来更深入地讨论词法分析器所做的工作。

词法分析器一般直接接收源文件输入,根据固定模式使用字符串模式匹配算法来产生token。一般来讲,词法分析是一个独立的程序,它只通过一个主要接口来向编译器后续部分返回token,当然,它也需要维护目前扫描的行数,通过另外的一个接口来准备向编译器返回行数数据,以向用户提示语法错误发生的位置。

也就是说,我们的词法分析器的类架构中一定有以下两个公有接口:

    token getNextToken();
    unsigned int getLine() const { return _line; }

符号表

词法分析器在识别出一个id类的token之后,可以将其存入一个unordered_map<string, token>中。同时,在初始化阶段,我们可以将所有的保留字存入这一散列表。

同时我们也可以将这个散列表提供给编译器的后端,它可以为这个散列扩充更多信息(如一个标识符的类型、地址)等。

所以词法分析器初步架构如下

class lexer {
private:
    unsigned int _line = 1;
    std::unordered_map<std::string, token> _idTable;

    std::ifstream _infile;
public:
    explicit lexer(std::string& fileName);

    unsigned int getLine() const { return _line; }
    std::unordered_map<std::string, token> getIdTable() const { return _idTable; }

    token getNextToken();
};


Copyright AmachiInori 2017-2021. All Right Reserved.
Powered By Jekyll.
amachi.com.cn