词法分析是编译器的第一阶段,也称为扫描器。它将高级输入程序转换为令牌序列。
- 可以使用确定性有限自动机来实施词法分析。
- 输出是令牌序列,该令牌序列发送到解析器以进行语法分析
什么是代币?
词汇标记是一系列字符,可以将它们视为编程语言语法中的一个单元。
令牌示例:
- 键入令牌(ID,数字,实数…)。
- 标点符号(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.令牌化,即将程序划分为有效令牌。
2.删除空格字符。
3.删除评论。
4.它还通过提供行号和列号为生成错误消息提供了帮助。
假设我们通过词法分析器传递了一个语句–
a = b + c ;它将生成令牌序列,如下所示:
id = id + id ;每个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也是一个令牌,然后我又是另一个令牌,最后;
Answer: Total number of tokens 7:
int, max, ( ,int, i, ), ;
以下是上一年的GATE关于词法分析的问题。