【问题标题】:Does the recognition of numbers belong in the scanner or in the parser?数字的识别属于扫描仪还是解析器?
【发布时间】:2011-08-18 16:42:05
【问题描述】:

当您查看语言的 EBNF 描述时,您经常会看到整数和实数的定义:

integer  ::= digit digit*   // Accepts numbers with a 0 prefix
real     ::= integer "." integer (('e'|'E') integer)?

(定义是即时做出的,我可能在其中犯了一个错误)。

虽然它们出现在上下文无关语法中,但数字通常在词法分析阶段被识别。它们是否包含在语言定义中以使其更完整,并且由实现者来实现它们实际上应该在扫描仪中?

【问题讨论】:

    标签: parsing lexical-analysis


    【解决方案1】:

    许多常见的解析器生成器工具——例如 ANTLR、Lex/YACC——将解析分为两个阶段:首先,输入字符串被标记化。其次,将标记组合成产生式以创建具体的语法树。

    但是,还有一些不需要标记化的替代技术:查看回溯recursive-descent parsers。对于这样的解析器,令牌的定义方式与非令牌类似。 pyparsing 是此类解析器的解析器生成器。

    两步技术的优势在于它通常会生成更高效的解析器——使用标记,字符串操作、字符串搜索和回溯要少得多。

    根据“The Definitive ANTLR Reference” (Terence Parr),

    [词法分析器和解析器]之间的唯一区别是,解析器识别标记流中的语法结构,而词法分析器识别字符流中的结构。

    【讨论】:

      【解决方案2】:

      语法语法需要完整才能准确,所以它当然包括标识符的精确格式和运算符的拼写等细节。

      是的,编译器工程师决定了,但通常很明显。您希望词法分析器有效地处理所有字符级细节。

      Is it a Lexer's Job to Parse Numbers and Strings? 有更长的答案

      【讨论】:

        猜你喜欢
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多