![]() |
1
1
flex不决定扫描仪何时返回(默认EOF规则除外)。它构建的扫描器在循环中执行词法操作,直到某些操作返回。所以这完全取决于您想要如何构造扫描仪。
然而,经典的YYParse/YYLEX处理模型由解析器调用组成。
在第一个代码示例中,没有解析器,扫描器操作仅限于打印出令牌。虽然示例是完全正确的,但是依赖于scanner循环来重复执行操作,我更喜欢第二个模型,即使您(还)不打算添加解析器,因为它将使令牌处理与令牌生成分离更容易。 但这并不意味着每个词汇操作都将包含一个返回语句。一些词汇模式对应于非标记(例如注释和空白),相应的操作很可能什么也不做(除了可能记录输入位置),这样扫描器将继续搜索要返回的标记。 (f)lex扫描器不容易生成协程,因此如果确实需要协程(例如,增量解析异步输入),那么可能需要另一个工具。 Bison确实提供了生成一个“push-parser”的可能性,在这个“push-parser”中,扫描仪 电话 解析器每次找到一个令牌,而不是 回到 解析器。但是无论是“推”还是传统的“拉”模型都与协程、imho没有任何关系,并且使用这个词来描述解析器/扫描器交互对我来说都是不精确和无用的(尽管我很尊重你引用的作者)。 |
![]() |
Kris · Flex-新行无法识别 7 年前 |
![]() |
omn_1 · yylineno为错误报告提供意外结果 7 年前 |
![]() |
Juan Torres · Flex:匹配有符号整数与加法/减法 9 年前 |
![]() |
mljli · flex正则表达式使用带有尾随上下文的{-} 9 年前 |
![]() |
TreeTree · lex和yacc的运行时“语法错误” 12 年前 |