词法分析是编译器的第一阶段,也称为扫描器。它将高级输入程序转换为Tokens序列。
- 词法分析可以用确定性有限自动机来实现。
- 输出是发送到语法分析器进行语法分析的令牌序列
什么是令牌?
词法标记是一系列字符,可以将其视为编程语言语法中的一个单元。
令牌示例:
- 类型标记(id、number、real、…)
- 标点符号(IF、void、return、…)
- 字母标记(关键字)
Keywords; Examples-for, while, if etc.
Identifier; Examples-Variable name, function name, etc.
Operators; Examples '+', '++', '-' etc.
Separators; Examples ',' ';' etc
非令牌示例:
- 注释、预处理器指令、宏、空格、制表符、换行符等。
Lexeme : 由模式匹配形成的字符序列
相应的标记或包含单个标记的输入字符序列称为词素。例如-“float”、“abs_zero_Kelvin”、“=”、“-”、“273”、“;” .
词法分析器的工作原理
1. Tokenization 即将程序划分为有效的令牌。
2. 去除空白字符。
3. 删除评论。
4. 它还通过提供行号和列号来帮助生成错误消息。
假设我们通过词法分析器传递一条语句——
a = b + c ;它将生成这样的令牌序列:
身份证=身份证+身份证;每个 id 在符号表中引用它的变量,引用所有细节
例如,考虑程序
int main()
{
// 2 variables
int a, b;
a = 10;
return 0;
}
所有有效的令牌是:
'int' 'main' '(' ')' '{' 'int' 'a' ',' 'b' ';'
'a' '=' '10' ';' 'return' '0' ';' '}'
以上是有效的令牌。
您可以观察到我们省略了注释。
作为另一个例子,考虑下面的 printf 语句。
此 printf 语句中有 5 个有效标记。
练习 1:
计算令牌数:
int main()
{
int a = 10, b = 20;
printf("sum is :%d",a+b);
return 0;
}
Answer: Total number of token: 27.
练习 2:
计算令牌数:
int max(int i);
- 词法分析器首先读取int并发现它是有效的并接受为令牌
- max被它读取,读取后发现是一个有效的函数名(
- int也是一个标记,然后又是i作为另一个标记,最后是;
Answer: Total number of tokens 7:
int, max, ( ,int, i, ), ;
以下是去年关于词法分析的 GATE 问题。