代码之家  ›  专栏  ›  技术社区  ›  René Nyffenegger

为解析器标记数字

  •  4
  • René Nyffenegger  · 技术社区  · 15 年前

    基本上,我的标记器暴露了 nextToken() 返回下一个标记的函数。这些令牌通过令牌类型进行区分。我认为应该有以下令牌类型:

    • 符号(例如 < := , ( 诸如此类
    • 空白(制表符、换行符、空格…)
    • 备注(介于/*…*/或之后//通过新线)
    • 数字
    • 字符串(括在“…”之间的东西)

    你觉得这有道理吗?

    NUMBER 数字 FLOAT 令牌类型?没有一个 浮动 令牌类型,我会收到 数字 (例如402),a SYMBOL (.)接着是另一个 如果我要分析一个浮点数。

    -909 ? 它应该归还 符号 - 首先,其次是 数字 909 数字 -909 马上?

    5 回复  |  直到 15 年前
        1
  •  4
  •   Craig Trader    15 年前

    这取决于你的目标语言。

    lexer背后的要点是返回标记,以便为您的语言编写解析器。假设你的雷克瑟回来了 NUMBER 当它看到与“[0-9]+”匹配的符号时。如果它看到一个非整数,如“3.1415926”,它将返回 . 数字 / . \不/ 其他注释*/456“作为浮点数。

    至于lexing“-[0-9]+”作为 MINUS 数字 数字 ,否则最终会将“A=1-2-3-4”作为 SYMBOL = 数字 数字 而不是 符号 = 数字 数字 数字 .

    Language Implementation Patterns ,作者Terrance Parr ANTLR .

        2
  •  4
  •   dty    15 年前

    最好的方法是使你的标记类型与语法的终端符号紧密匹配。

    在不了解语言/语法的情况下,我希望您最好使用“LESS\u THAN”、“LESS\u THAN\u OR\u EQUAL”以及“FLOAT”、“DOUBLE”、“INTEGER”等标记类型。

        3
  •  3
  •   Oak    15 年前

    根据我的实际经验:

    1. 确保检查是否确实需要注释/空白标记。编译器通常不需要它们,而ide通常需要它们(例如,将注释涂成绿色)。
    2. 避免拆分文字。如果 "hello world" 是字符串文本,将其作为单个标记进行分析。如果 -3.058e18 是一个float文本,也将其作为单个标记进行解析。lexer通常依赖于正则表达式,正则表达式对所有这些事情都有足够的表现力,等等。当然,如果文字足够复杂 拆分它们(例如Smalltalk中的块文字)。
        4
  •  2
  •   Alessandro Baldoni    15 年前

    数字应该是多少?总是正整数,浮点数。。。

        5
  •  0
  •   djhworld    15 年前

    这取决于你如何接受代币,如果你是一个字符一个字符地做,那么可能有点棘手,但如果你是一个字一个字地做,即。

    int a = a + 2.0
    

    那么标记将是(丢弃空格)

    int
    a
    =
    a
    +
    2.0
    

    这样你就不会陷入解释 . 在token中,而是把整个字符串都放进去,在这里你可以确定它是浮点数还是数字,或者你想要的任何东西。

    推荐文章