从字符取得记号
程序文本由字符组成,词法分析器把其中的标识符、数字、关键字和标点等识别为记号。记号通常包含类别,也可以附带名字拼写、数值或源位置等信息,供后续处理使用。
LLVM教程的Kaleidoscope词法器把数字记号与数值、标识符记号与名称分别传递。它略过某些空白和注释,是示例语言的规则;不能据此认定所有语言的空白都无意义。
参考:[1]
多个匹配需要选择规则
同一段输入可能同时符合多条模式。例如一个关键字也可能符合普通标识符模式;分析器需要有明确规则决定返回哪种记号,不能仅靠所有模式都“能匹配”就得到唯一结果。
flex生成的扫描器优先选择匹配文本最长的规则,长度相同时使用输入文件中较早的规则。这个约定解释了模式顺序为何会影响结果,也说明分词策略是实现契约的一部分。
参考:[2]
分词之后还要建立结构
识别出数字、加号和乘号,只说明输入包含哪些基本单位,尚未确定哪一个运算先组合。语法分析依据产生式、优先级及结合性等规则建立层级,随后还可能检查名字与类型。
词法器本身也需处理不合法记号和边界。LLVM示例明确承认其数字读取仍需补足错误检查;教学中的短小扫描循环,不应被误当成已经覆盖完整语言输入的生产级实现。