当您查看某种语言的EBNF描述时,您经常会看到整数和实数的定义:
integer ::= digit digit* // Accepts numbers with a 0 prefix
real ::= integer "." integer (('e'|'E') integer)?
(定义是在飞行中做出的,我可能在它们中犯了错误。)
尽管它们出现在无上下文语法中,但数字通常在词法分析阶段被识别。它们是否包含在语言定义中以使其更加完整,是否应由实施者意识到它们应该实际存在于扫描仪中?
答案 0 :(得分:3)
许多常见的解析器生成器工具(如ANTLR,Lex / YACC)将解析分为两个阶段:首先,输入字符串是标记化的。其次,将标记组合到制作中以创建具体的语法树。
但是,有些替代技术不需要标记化:请查看回溯recursive-descent parsers。对于这样的解析器,令牌以与非令牌类似的方式定义。 pyparsing是这种解析器的解析器生成器。
两步技术的优势在于它通常可以生成更高效的解析器 - 使用令牌,可以减少字符串操作,字符串搜索和回溯。
根据“最终的ANTLR参考”(Terence Parr),
[词法分析器和解析器]之间的唯一区别是,解析器识别标记流中的语法结构,而词法分析器识别字符流中的结构。
答案 1 :(得分:1)
语法语法需要精确完整,因此当然它包含有关标识符的精确格式和运算符拼写的详细信息。
是的,编译工程师决定但通常很明显。您希望词法分析器有效地处理所有字符级细节。
的答案更长