您可以自由地共享和演绎本文稿, 只需遵守开源协议[CC By 4.0]
如果这篇文章帮助到你, 可以请我喝一杯咖啡~
词法分析器
我们继续来更深入地讨论词法分析器所做的工作。
词法分析器一般直接接收源文件输入,根据固定模式使用字符串模式匹配算法来产生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();
};