《编译原理及实践》回顾:词法分析

前段时间看了点《编译原理及实践》没看多少就忍不住要照着书写个简单的c解释器,没想到有了书上的方法代码写起来意外的顺利。现在有了这个可以xjer搞的个人站,正好来乱写凑数回顾一下结合书本和实践得来的个人经验(并不严谨,只是个人的感性认识)。

词法分析是啥

引用原文:

编译器的扫描或词法分析( lexical analysis)阶段可将源程序读作字符文件并将其分为若干个记号。

这个记号,即token。举个例子;

for(int i=0;i<9;i++)
{
    cout<<"啦啦啦啦"<<endl;

    /*
        注释块
        awsl
    */
}

在这个小程序中,token依次是for ( int i ; i < 9 ; i ++ ) { cout << 啦啦啦啦 << endl ; 注释块\nawsl}。如你所见,词法分析中编译器尽可能地丢弃了源代码中的无用信息(换行、空格、空行)。

为何需要词法分析

众所周知,同样一段代码因为排版有着不同的形式:

if(true) i++; else i--;
if ( true ) i++ ;
else i-- ;
if(true)
    i++;
else
    i--;

而丢弃了换行空格等无用信息的词法分析,对上面三种不同排版的输入得出的token序列是一样的,这使写编译器(解释器)的我们可以只编写一份代码,来处理所有意思相同但排版不同的输入,大大节省精力。

顺便,词法分析中编译器会标记每一个token的"性质"。例如,for int i cout等会被标记为ID,9标记为数字,{ ; ++ <<等标记为符号。这是为后来的语法树的建立提供信息。《编译原理及实践》告诉我,词法分析中提取的信息越多,对后续的工作越有利。

本文链接:

http://yorkin.cool/index.php/archives/12/
1 + 1 =
11 评论
    冰棍Chrome 79Windows 10
    3月4日 回复

    支持死方程

      YorkinChrome 80Windows 10
      3月4日 回复

      @冰棍 死冰棍

    404Chrome 82Windows 10
    3月4日 回复

    OωO

      YorkinChrome 80Windows 10
      3月4日 回复

      @404 |´・ω・) ノ

    阳光加冰QQ Browser 6Android P
    3月4日 回复

    死方程を支持

      YorkinChrome 80Windows 10
      3月4日 回复

      @阳光加冰 谢支持

    slacksoftChrome 80Android P
    3月4日 回复

      YorkinChrome 80Windows 10
      3月4日 回复

      @slacksoft ∠( ᐛ 」∠)_

    DIMOJANGChrome 82Windows 10
    3月4日 回复

    原来是这样 支持方程

      YorkinChrome 80Windows 10
      3月18日 回复

      @DIMOJANG (ノ °ο°) ノ

    SWLChrome 80Windows 10
    3月18日 回复

    拜见方程佬