我想自己构建一个小词法分析器和解析器。我希望词法分析器生成一个标记向量,稍后将其输入到解析器中。现在我想一下什么属于哪个阶段。
让我们看看这个输入:
xy = 1.23
我的令牌流可能是以下之一 - 或两者的混合:
letter letter whitespace eqsign whitespace digit dot digit digit
identifier eqsign decimal
为了进一步处理输入,我当然需要(2)。但词法分析器阶段能在多大程度上完成这项工作呢?我还可以想到 2 个连续的词法分析器阶段,其中 Lexer1 将从
String
生成 (1),而 Lexer2 将从 List<Lexer1Token>
生成 (2)。
类似地,对于 HTML 中的
<b>test</b>
,标记可能是
lt string gt string lt slash string gt
opentag[type=b] string closingtag[type=b]
显然,这取决于您的语言(例如,您的语言可能需要对
.``.
进行特殊处理),但在大多数情况下,您只需要版本 2,[identifier, equal, decimal]
(我称之为 assign
)。
让词法分析器在不进入解析器域的情况下尽可能多地执行操作(例如,决定顺序是否有效)。