代码之家  ›  专栏  ›  技术社区  ›  user216441

Lexer需要提供哪些功能?

  •  2
  • user216441  · 技术社区  · 14 年前

    我正在做一辆雷克萨斯,不要告诉我不要做,因为我已经做了大部分。
    目前它生成一个令牌数组,就这样。

    我想知道,lexer需要提供哪些函数,以及每个函数需要做什么的简要说明。

    我接受最完整的清单。

    一个示例函数是:

    下一个 :使用当前令牌并返回它

    另外,雷克斯应该 expect 函数还是解释程序应该实现它?

    顺便说一下,lexer构造函数接受一个字符串作为参数,并进行词汇分析,并将所有标记存储在“tokens”变量中。

    语言是javascript,所以我不能重载操作符。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Matti Virkkunen    14 年前

    通过编写一个使用lexer的程序,并实现最终需要的功能,您应该能够编译一个全面的列表。

        2
  •  3
  •   Pointy    14 年前

    根据我的经验,你需要:

    • nextToken -在输入中向前移动并获取下一个令牌。
    • curToken -返回当前令牌;不要移动
    • curValue -字符串和数字之类的标记具有值;分号之类的标记不具有值
    • sourcePos -返回当前标记第一个字符的源位置(行号、字符位置)

    编辑 -哦还有:

    • prefetch -通过获取第一个令牌初始化lexer。

    此外,对于某些语言,您可能需要2个或多个lookahead标记。那么你想要一个简单的变种 令牌 这样您就可以看到令牌流上更大的“窗口”。但对于大多数语言来说,这并不是真正必要的。

    再次编辑 -我也不会告诉你不要写,因为它们基本上是最有趣的东西。在Javascript中,你不能太疯狂,但是在Erlang这样的语言中,你可以让lexer像一个“令牌泵”,让它生成一个令牌流,发送给一个单独的解析器进程。

        3
  •  0
  •   Jakob    14 年前

    第二次思考你的问题:“Lexer需要提供什么功能”

    它“需要”什么当然取决于 需要,不是什么 需要。如果你能解释自己的需要,我们可能会给你更好的帮助。但不管怎样,这里有一个镜头:

    最小值由一个函数组成,该函数将字符串作为参数,并返回一个字符串列表(或者,如果您希望得到花哨和延迟,则返回字符串的迭代器)。对于许多用例来说,这已经足够了,因此这就是lexer所需要的。

    更具描述性的一个可以返回比字符串更复杂的对象,包含关于每个令牌的进一步信息(例如,它在原始字符串中的位置,这样您就能够告诉可怜的程序员代码中他应该查看的语法错误)。除了行数之外,您可能还可以在其中添加大量的元数据,但这又一次取决于您的需要。