📜  词法分析简介

📅  最后修改于: 2021-09-27 06:26:58             🧑  作者: Mango

词法分析是编译器的第一阶段,也称为扫描器。它将高级输入程序转换为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. 它还通过提供行号和列号来帮助生成错误消息。

啦

  • 词法分析器借助自动化机器和它所基于的给定语言(如 C、C++)的语法识别错误,并给出错误的行号和列号。

    假设我们通过词法分析器传递一条语句——

    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 问题。