如果扫描仪发现一个单词在语言中不存在,他将停止扫描其余单词,还是继续并获取令牌



c++语法

int x = 5;

扫描仪将获取该语句的令牌

来自

int x = 5;

< int>
< x >
< = >
< 5 >
< ; >

如果出现语法错误怎么办

intd x = 5;

他会不会得到正确的代币?

x不是该语言中的一个单词。但这只是象征。类似地,intd在语言中不是一个单词,但它和x一样是一个标记。如果这里的语言是C,那么:

int x = 3;
int intd = 3;
typedef int intd; intd x = 3;

都是有效的。

这些对lexer扫描仪来说都无关紧要。将语法分析分为词汇分析和句法分析(然后产生几轮不同类型的语义分析和代码生成(的全部目的是将关注点分开。每个组成部分都有明确的、有限的责任,不应该被赋予不相关的任务。

词法扫描器的工作是将输入划分为标记和可忽略的空白。然后,令牌被馈送到解析器中,解析器的工作是推导输入的语法结构。这种分析的结果——通常是一个带注释的语法树——是后续语义分析步骤所使用的结果。

这很难说词法扫描器对语法一无所知。它只是将输入划分为词汇单元,并让解析器的其余部分完成其余的工作。

最新更新