解析器和扫描器有什么区别?

18

我已经做了一个扫描器,现在应该制作一个解析器。它们有什么区别?


2
我将Flex标签删除,并用更一般的lexical-analyser标签替换它,因为StackOverflow上的Flex标签引用了Adobe Flex框架。 - Ryan Lynch
2个回答

29

一个扫描器(Scanner)只是将输入的字符串(例如文件)转换成一组标记。这些标记代表诸如标识符、括号、运算符等东西。

解析器(Parser)将这个标记列表转换成类似树状对象的形式,以表示这些标记如何相互配合形成一个完整的整体(有时称为一个句子)。

在编程语言解析器方面,输出通常被称为抽象语法树(AST)。AST中的每个节点都表示语言的不同构造,例如IF语句将成为一个节点,带有2或3个子节点,一个CONDITION节点,一个THEN节点和可能还有一个ELSE节点。

解析器没有为这些节点赋予任何含义,仅仅保持结构的连贯性。接下来需要做的是从这个结构中提取含义(有时称为上下文分析)。


5

解析(在一般意义上)是将符号(字符、数字、左括号等)转化为语法句子的过程。

词法分析器(“lexer”)将源代码文件中的单个符号解析为标记。从那里开始,“解析器”将这些完整的标记转换为您的语法句子。

换句话说,词法分析器将符号组合成标记,而解析器将标记组合成句子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接