资源下载地址:https://download.csdn.net/download/sheziqiong/86873815
资源下载地址:https://download.csdn.net/download/sheziqiong/86873815

编译原理 词法分析实验

一、实验说明

词法分析程序实验:

  1. 实验目的:通过扩充已有的样例语言TINY语言的词法分析程序,为扩展TINY语言TINY+构造词法分析程序,从而掌握词法分析程序的构造方法
  2. 实验内容:了解样例语言TINY及TINY编译器的实现,了解扩展TINY语言TINY+,用C语言在已有的TINY词法分析器基础上扩展,构造TINY+的词法分析程序。
  3. 实验要求:将TINY+源程序翻译成对应的TOKEN序列,并能检查一定的词法错误。

提交源程序和可运行程序。

二、TINY+词法定义

来源:同学在作业连接下分享的文件

2.1 关键字

关键字包括:(小写)

or, and , int, bool, char, while, do, true, false

if, then, else, end, repeat, until, read, write

2.2 操作符

操作符包括:

>, <=, >=, <, =

,, ', {, }, ;, :=

(,), +, -, *, /

2.3 分隔符

空格符包括: , \t, \n,在词法分析后不被保留。

2.4 其他符号

其他符号有四种,他们的正则定义如下:

  • 标识符 IDletter(letter|digit)*
  • 数字 NUMdigit digit*
  • 字符串 STRING'any char except ' '(不能跨行定义)
  • 注释:{...}(用花括号标注,可以跨行定义)

三、程序说明

3.1 编译运行

  • Windows下运行

    gcc la.c -o la.exe
    a.exe
    
  • 测试文件位于\test文件夹

3.2 数据定义

  • 程序中定义的 TOKEN 类型

        // Keyword tokens                   // |-18 Keywords-----------|KEY_OR, KEY_AND, KEY_NOT,           // | or    | and   | not   |    KEY_INT, KEY_BOOL, KEY_CHAR,        // | int   | bool  | char  |    KEY_WHILE, KEY_DO,                  // | while | do    |       |    KEY_IF, KEY_THEN, KEY_ELSE,         // | if    | then  | else  |    KEY_END, KEY_REPEAT, KEY_UNTIL,     // | end   | repeat| until |    KEY_READ, KEY_WRITE,                // | read  | write |       | KEY_TRUE, KEY_FALSE,                // | true  | false |       | // Operator tokens                  // |-17 Operators-|OP_G, OP_L, OP_ASSIGN,              // | >  | <  | := |  OP_GE, OP_LE, OP_EQ,                // | >= | <= | =  |OP_COMMA, OP_QUOTA, OP_SEMI,        // | ,  | '  | ;  |OP_LPAREN, OP_RPAREN,               // | (  | )  |    |OP_LBRACE, OP_RBRACE,               // | {  | }  |    |OP_ADD, OP_SUB,                     // | +  | -  |    |OP_MUL, OP_DIV,                     // | *  | /  |    |// Other tokens     // |-Each NF--------------------|-Example-|ID,                 // | letter(letter|digit)*      | c1      |NUM,                // | digit digit*               | 123     |STRING,             // | ' any character except' '  | 'hi!'   |NONE,               // |                            | 1c      |ANNO                // | { any character }          | {hi}    |
    };
    

    并提供相关函数获取TOKEN_TYPE,其字符串形式

    char* getTokenName(enum TOKEN_TYPE i);
    enum TOKEN_TYPE getTokenType(char *token);
    
  • 以下是词法分析有关数据结构

    typedef struct TOKEN{           // TOKEN 二元组enum TOKEN_TYPE type;       // 词素char info[SIZE_2];         // 含义
    }TOKEN;FILE* file;                      // 待分析文件的指针
    TOKEN file_tokens[SIZE_1];      // 保存词法分析结果
    int file_tokens_num;            // 分析的TOKEN总数int current_row;               // 当前扫描位置(行数)
    int current_col;                // 当前扫描位置(列数)
    char current_word[SIZE_2];      // 当前扫描得到的单词
    int current_word_ptr;           // 当前扫描单词的长度
    enum TOKEN_TYPE current_type;   // 当前的预测TOKEN类型
    int operator_flag = 0;         // 操作符标记int error;                      // 词法分析错误处
    

3.3 核心函数

/*** 初始化:为所有用到的变量(@line 136- 147)赋初始值,若文件无啊打开,提示报错。* @param file_path* @return 1 if the file is opened successfully, otherwise 0. */
int la_initial(char file_path[]);/*** 根据当前的 current_word 和 current_type 生成 Tokens 并保存在 file_tokens 中。*/
void la_make_token();/*** 输出词法编译结果:显示出错原因和出错位置(几行几列)* @param message 出错信息* @param row 出错位置(行数)* @param col 出错位置(列数)*/
void la_show_error(const char* message, int row, int col);/*** 在扫描新的一行时进行预处理*/
void la_update_line();/*** 根据下一个字符 c 来更新 current_word 和 current_type。* @param c lookahead symbol*/
void la_update_word(char c);/*** 词法分析入口:执行文件字符扫描和词法分析,在出现错误时或读完程序时终止*/
void la_start();

3.4 主函数

  • 用户可以输入文件地址,每次输入一个文件路径,程序读取文件内容并作语法分析,将词法分析结果直接输出。

  • 核心部分代码:

    if(la_initial(file_path)){    // 1、初始化,若成功则进入词法分析la_start();               // 2、执行词法分析if(error == 0)         // 3、若没有错误出现la_show_result();   // 4、则输出TOKEN序列
    }
    

四、测试效果

测试 1

  • 测试一段普通的TINY+程序的词法分析结果

    char str;
    int x, fact;
    str:= 'sample program in TINY+ language';
    read x;
    if x > 0 and x < 100 then { don't do it }fact:=1;while x > 0 do fact:=fact*x;x:=x-1write fact
    end
    
  • 测试结果:如下图所示。


测试 2

  • 测试内容:测试所有关键字和运算符,并给出几个比较特殊的嵌套例子:{cc'oo'o}'cco{}coc'
true false or and not
int bool char while do
if then else end repeat
until read write , ;
:= + - * /
( ) < = >
<= >= a2c 123 'EFG'
{cc'oo'o} cco0 'cco{}coc'
  • 测试结果:所有词都被正确识别并转化为Token

测试 3

  • 测试内容:测试击中错误代码,分别保存在t3.txtt4.txtt5.txtt6.txt中。

    $ hello
    123hello
    hello'
    hello}
    

    它们分别代表:非法字符输入、非法ID、字符串不完整、注释不完整。

  • 测试结果:

资源下载地址:https://download.csdn.net/download/sheziqiong/86873815
资源下载地址:https://download.csdn.net/download/sheziqiong/86873815

基于C语言的词法分析实验相关推荐

  1. 《编译原理》实验报告——TINY语言的词法分析

    TINY语言的词法分析 实验目的 (评价依据,描述是否准确到位) 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造. 构造出的扫描器,能够读入教材样例中给出的tiny语言的示 ...

  2. 基于LEX的词法分析实验

    基于 LEX 的词法分析实验 实验目的 熟悉 Lex 基本语法,掌握 ParserGenerator 软件的使用 通过设计 开发通用高级语言一个单词种类的词法分析程序,加深对课堂教学内容(包括正规文法 ...

  3. c语言实验报告世界时钟,基于LCD的电子时钟实验报告.doc

    PAGE \* MERGEFORMAT 3 河海大学物联网工程学院 课程设计报告 题 目 基于LCD的电子时钟实验 专业.学号 电信 . 授课班号 完成时间 2013.07.05 课程设计(报告)任务 ...

  4. 语法分析器c语言实验报告,词法分析实验报告(C++)..doc

    词法分析实验报告(C). 词法分析实验报告 一.实验目的 1. 掌握词法分析的原理. 2. 熟悉保留字表等相关的数据结构与单词的分类方法. 3. 掌握词法分析器的设计与调试. 二.实验内容 根据编译中 ...

  5. 电力系统matlab实验报告,基于matlab语言计算电力系统暂态稳定仿真程序实验报告.docx...

    基于matlab语言计算电力系统暂态稳定仿真程序实验报告 BeijingJiaotongUniversity 电力系统分析 暂态稳定分析实验 学院:电气工程学院 班级:xxxxxxxx 学号:xxxx ...

  6. 【R语言实验】基于R语言的时间序列平稳性检验

    一.实验项目名称:基于R语言的时间序列平稳性检验 二.实验目的与要求: 平稳时间序列的概念,平稳性检验的时序图检验方法和自相关图检验方法. 三.实验原理: 时序图和自相关图检验时间序列的平稳性依据: ...

  7. 基于R语言的主成分回归(PCR)与Lasso回归在水稻基因组预测中的对比(生信数基实验作业)

    基于R语言的主成分回归(PCR)与Lasso回归在水稻基因组预测中的对比 0 引言 全基因组选择是 21 世纪动植物育种的一种重要的选择策略,其核心就是全基因组预测,即基于分布在整个基因组上的多样性分 ...

  8. 编译原理实验一 TINY语言的词法分析

    实验一 TINY语言的词法分析 一.实验目的 (评价依据,描述是否准确到位) 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造.实验结果:构造出的扫描器,能够读入教材样例中给 ...

  9. c语言张振国实验报告,基于VisualC的黄金分割法程序设计实验报告.doc

    基于VisualC的黄金分割法程序设计实验报告 新疆农业大学机械交通学院 实验报告 基于Visual C 的黄金分割法程序设计 一 .实验目的 1. 加深对机械优化设计方法的基本理论和算法步骤的理解: ...

最新文章

  1. MySQL面试题 | 附答案解析(四)
  2. xcode8控制台输出大量不用的log的问题解决NSLog失效的解决
  3. shell+中sum的用法_SUM函数从入门到进阶,不用放弃!
  4. 关于移动端meta设置(未完待续)
  5. 修改服务器时间需要重启吗,云服务器需要定期重启吗
  6. Vim 命令行快捷键
  7. 如下哪个是Java中的合法自定义标识符_吉大13春《面向对象程序设计》在线作业答案...
  8. [360优化]让360安全卫士比火绒还好用 #调教360
  9. SQL语句值left join,right join,inner join的用法
  10. VBA 禁止在某个sheet中使用键盘Delete键
  11. IE无法打开链接的处理方法
  12. 基于haar+adaboost的人脸检测、深度学习的人脸识别技术应用综述
  13. iOS开发——扫二维码下载APP
  14. leetcode-881 救生艇
  15. android Twitter第三方登陆
  16. 【UI设计】使用ps软件进行一些简单的操作
  17. python抓取网站重要url_[Python]网络爬虫(一):抓取网页的含义和URL基本构成
  18. 2022年N1叉车司机操作证考试题模拟考试平台操作
  19. 【操作系统】操作系统的主要任务
  20. 锁相环环路滤波器分析

热门文章

  1. USB转串口那些事儿—电源与防倒灌设计
  2. Flutter尾随逗号
  3. 倩女幽魂OL 彩色字 怎样打彩色字体
  4. 人工智能----->第二天,Numpy,Matplotlib,如何构建机器学习问题,数据集的收集、采样、拆分,数据的转换
  5. Linux arm系统支持U盘exfat和ntfs
  6. java打印/导出自定义word文档
  7. deallocate mysql_Mysql预处理语句prepare、execute、deallocate
  8. 操作系统中的进程管理
  9. 通过WriteProcessMemory改写进程的内存
  10. 如何给黑白照片上色?推荐三个给黑白照片上色的方法