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


    设计内容

      手工设计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

      分号 ;

      右大括号 }

      非法单词 @

      非法单词 @

    结语

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

  • 相关阅读:
    WriteFile函数
    良好的动态内存申请与释放
    只需一条命令,快速在Windows 10上关闭Linux
    盘点程序员过年最怕被问的问题:薪资问题首当其冲,对象问题紧追其后
    程序员为什么是吃青春饭,而不是像医生律师一样越老越值钱?
    Linux网络配置的三种方法,手把手教你,一看就会!
    应届程序员VS往届程序员:当面对HR和领导时,此时的内心活动是这样的...
    MySql数据在磁盘上到底是怎么存储的?被存储的数据怎么查找?
    如何写出高质量的代码?优秀的程序员都是这样做的
    哼!MySQL 8.0不讲武德,给我挖坑!
  • 原文地址:https://www.cnblogs.com/H-Vking/p/5168876.html
Copyright © 2020-2023  润新知