编译原理课程设计——词法分析器

设计内容

  手工设计C语言的词法分析器(也可以是C语言的子集)。处理C语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组的形式存放在文件中。

分析

  如果我们要做一个词法分析器,那么我们要先构造出一个状态图来表示单词规则,而在构造状态图之前要先了解该语言的单词种类。由于C语言中的单词种类较多,这里我们简化一下,只考虑一些比较简单的单词种类,而没有考虑一些比较复杂的内容,比如逻辑运算、数组的处理、注释的处理等等。单词种类如下表所示:

  分析完单词规则后我们可以构造出状态图:

实现

  有了状态图,我们就可以按照状态图中的顺序来处理C语言的源程序,根据每个条件选项来判断每个单词的种类以及是否合法,因此程序实现也会很简单。

样例输入(输入来自文件in.txt):

int main() {

       int a , b , c_;

       int 100abc;

       char s = 'a';

       string st = "132";

       a = 100 , b = 200 , c = 300;

       for(int i = 1 ; i <= 20 ; i = i+1) {

              a = a + b;

       }

       return 0;

}

@@

样例输出(输出至文件out.txt):

  标识符或关键字 int

  标识符或关键字 main

  左括号 (

  右括号 )

  左大括号 {

  标识符或关键字 int

  标识符或关键字 a

  逗号 ,

  标识符或关键字 b

  逗号 ,

  标识符或关键字 c_

  分号 ;

  标识符或关键字 int

  非法单词 100abc

  分号 ;

  标识符或关键字 char

  标识符或关键字 s

  赋值 =

  字符 'a'

  分号 ;

  标识符或关键字 string

  标识符或关键字 st

  赋值 =

  字符串 "132"

  分号 ;

  标识符或关键字 a

  赋值 =

  数字 100

  逗号 ,

  标识符或关键字 b

  赋值 =

  数字 200

  逗号 ,

  标识符或关键字 c

  赋值 =

  数字 300

  分号 ;

  标识符或关键字 for

  左括号 (

  标识符或关键字 int

  标识符或关键字 i

  赋值 =

  数字 1

  分号 ;

  标识符或关键字 i

  小于等于 <=

  数字 20

  分号 ;

  标识符或关键字 i

  赋值 =

  标识符或关键字 i

  加 +

  数字 1

  右括号 )

  左大括号 {

  标识符或关键字 a

  赋值 =

  标识符或关键字 a

  加 +

  标识符或关键字 b

  分号 ;

  右大括号 }

  标识符或关键字 return

  数字 0

  分号 ;

  右大括号 }

  非法单词 @

  非法单词 @

结语

  这是我上学期编译原理的课程设计之一,为防伸手党这里就不附代码。其实代码很容易构造的,利用状态图判断就可以了。

原文地址:https://www.cnblogs.com/H-Vking/p/5168876.html