数字识别是否属于扫描仪或解析器?

时间:2011-08-18 16:42:06

标签: parsing lexical-analysis

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

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

(定义是在飞行中做出的,我可能在它们中犯了错误。)

尽管它们出现在无上下文语法中,但数字通常在词法分析阶段被识别。它们是否包含在语言定义中以使其更加完整,是否应由实施者意识到它们应该实际存在于扫描仪中?

2 个答案:

答案 0 :(得分:3)

许多常见的解析器生成器工具(如ANTLR,Lex / YACC)将解析分为两个阶段:首先,输入字符串是标记化的。其次,将标记组合到制作中以创建具体的语法树。

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

两步技术的优势在于它通常可以生成更高效的解析器 - 使用令牌,可以减少字符串操作,字符串搜索和回溯。

根据“最终的ANTLR参考”(Terence Parr),

  

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

答案 1 :(得分:1)

语法语法需要精确完整,因此当然它包含有关标识符的精确格式和运算符拼写的详细信息。

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

Is it a Lexer's Job to Parse Numbers and Strings?

的答案更长