📜  词法分析导论

📅  最后修改于: 2021-06-28 06:47:33             🧑  作者: Mango

词法分析是编译器的第一阶段,也称为扫描器。它将高级输入程序转换为令牌序列。

  • 可以使用确定性有限自动机来实施词法分析。
  • 输出是令牌序列,该令牌序列发送到解析器以进行语法分析

什么是代币?
词汇标记是一系列字符,可以将它们视为编程语言语法中的一个单元。

令牌示例:

  • 键入令牌(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.它还通过提供行号和列号为生成错误消息提供了帮助。

啦啦

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

    假设我们通过词法分析器传递了一个语句–

    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关于词法分析的问题。