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扫描仪来说都无关紧要。将语法分析分为词汇分析和句法分析(然后产生几轮不同类型的语义分析和代码生成(的全部目的是将关注点分开。每个组成部分都有明确的、有限的责任,不应该被赋予不相关的任务。
词法扫描器的工作是将输入划分为标记和可忽略的空白。然后,令牌被馈送到解析器中,解析器的工作是推导输入的语法结构。这种分析的结果——通常是一个带注释的语法树——是后续语义分析步骤所使用的结果。
这很难说词法扫描器对语法一无所知。它只是将输入划分为词汇单元,并让解析器的其余部分完成其余的工作。