2011-08-18 60 views
5

当你看一个语言的EBNF描述,你经常看到的整数和实数的定义:数字的识别属于扫描仪还是解析器?

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

(定义是在飞行中做,我可能已经在他们犯了一个错误)。

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

回答

3

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

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

两步技术的优点是它通常会产生更高效的解析器 - 带有标记,字符串操作少,字符串搜索和回溯。

据“权威ANTLR参考”(特伦斯帕尔)

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

1

语法语法需要完整准确,所以当然它包含有关标识符的精确格式和操作符拼写的详细信息。

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

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