小白说编译原理-9-最简单minus-c语言编译器

简介

继上节8说到利用手动构建的语法树解析下面的c语言代码:

    a = 1
    sum = 0
    input(x)
    while(a <= x){
       sum = sum + a
       a = a+1;
    }
    print(sum)

而一个编译器不应该依赖用户去手动构建对应语言的语法树,我们需要的是一种支持自动构建语法树的策略。本节将要说明的就是如何利用前面1-6节学到的lex,yacc以及符号表,7-8节学到的语法树来支持给定c语言代码自动构建过程。

动机

在第5节变量支持的计算器中,对于expr的语法解析有如下的yacc代码:

 lines   :   lines expr EOL  { printf("%g\n", $2); }
            |   lines EOL
            |   lines COMMENT
            |
            ;

    expr    :   expr PLUS expr  { $$ = $1 + $3; }
			|	expr MINUS expr	{ $$ = $1 - $3; }
			|	expr TIMES expr	{ $$ = $1 * $3; }
			|	expr OVER expr	{ $$ = $1 / $3; }
			|	LP expr RP	{ $$ = $2; }
			|	‘-‘ expr %prec UMINUS	{ $$ = -$2; }
			|	NUMBER {$$=$1;} //$$=$1 can be ignored
            |   ID {$$ = sym_table.getValue($1);}//get value from sym_table
			|   ID ASSIGN expr {sym_table.setValue($1, $3); $$=$3; }//modify the value

已经知道的是上面每一行都是对应的语法匹配规则(例如expr PLUS expr)以及当规则匹配后要执行的动作(位于{}中,例如$$ = $1 + $3;)。如果将上面要执行的动作修改为创建对应的语法表达式节点,不就可以实现自动构建语法树了吗? 针对上面的expr PLUS expr,其对应的动作可以修改为

$$ = expr.NewRoot(EXPR_NODE, OP_EXPR, NodeAttr(PLUS), Integer, $1, $3);

同理,其他语法规则的执行动作也可以进行相应的修改,这样当一个表达式语法分析完毕后,对应的表达式语法树也就构建完成了。

总体概览

  1. lex和yacc进行相应的词法,语法分析,并构建对应的语法树
  2. tree.h和tree.cpp用来支撑语法树的构建过程,提供相应的创建函数,被yacc使用
  3. symtable.h和symtable.cpp用来支撑符号表的构建过程,提供符号表的创建,访问,修改等操作,用于支持变量以及可能的函数扩展。
  4. 只支持最基本的c语言,也就是第8节已经进行测试过的。总述如下:变量,变量赋值,算术逻辑等运算,if语句,while语句,输入输出语句,表达式语句,复合语句(不支持变量声明,变量名出现的第一次开始将其加入到符号表,默认值为0,使用赋值运算符可对变量值进行修改)。

可支持如下的代码:

其为迭代法解一元二次方程组,方程的三个参数为a,b,c。

void interation()
{
    //求解X1,在曲线对称轴处选择初始点
    double index=(-1.0*b)/(2*a),temp;
    if(b!=0)//b不等于0时进行迭代
    {
        temp=index;
        index=-1.0*(a*temp*temp+c)/b;
        while((absolute(index-temp))>accuracy)
        {
            temp=index;
            index=-1.0*(a*temp*temp+c)/b;
        }
        x1=index;
        x2=(-1.0*b)/a-x1;
    }
    else//b=0时ax^2+c=0直接求解
    {
        x1=sqrt(-1.0*c/a);
        x2=-x1;
    }
}

未完待续

时间: 2024-07-30 19:30:09

小白说编译原理-9-最简单minus-c语言编译器的相关文章

小白说编译原理-5-变量支持计算器

简介 本章依然专注于使用yacc实现计算器,主要的特点是给算术运算增加变量支持. 模块拆分 它主要分为3个模块 1. lex词法分析器 2. yacc语法分析器 3. 符号表 功能描述 1. lex词法分析器 正规式的定义如下: delim [ \t] ws {delim}+ letter [a-zA-Z] digit [0-9] id {letter}({letter}|{digit})* /* can support 12.34 */ number {digit}+(\.{digit}+)?

编译原理:实现简单数学公式排版

这是大三下上编译原理时老师要求做的大作业 1.实验具体要求 [题目和测试程序来自 李卫海老师:http://staff.ustc.edu.cn/~whli] 一.         符号集 小写字母a.b.c.d.e.f.g.h.i.j.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z 数字0.1.2.3.4.5.6.7.8.9 特殊符号:\.(.).{.}._.^.$ 分隔符:空格.换行   二.         记号定义 标识符:由字母开始,由字母和数字组成 数字:无符号整型数  

小白说编译原理-6-lex和yacc环境配置-多图

lex和yacc的使用很简单,但环境配置却是各种问题,本章说明lex和yacc在windows下的环境配置. 软件需求: 系统 win7-64位(win7-32, win8, win10全部通过) c++编译器: vs2010(2008,2013,2015也全部通过) lex和yacc编译器: ParGen.exe 基本流程: 安装Pargen.exe,采用的默认目录安装在C:\Program Files (x86)\Parser Generator 2\ 安装vs2010,这个各种教程,不再赘

编译原理词法分析 java简单实现

package com.csray; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class LexicalAnalysis { static String id; public static void main(String[] args

关于编译原理

1.编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 2.编译原理是计算机科学与技术中一个非常成熟的分支,非常完美地将原理与技术结合了起来,对于理解计算机的本质非常有帮助 . 编译原理是计算

对编译原理这门课程的看法

对我来说,我市首次听到和接触到"编译原理"这个词,但是经过一晚上的探索,已经有了一定的了解. 首先是编译原理就是什么? 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 编译原理及

Atitit.编译原理与概论

编译原理 词法分析 Ast构建,语法分析 语意分析 6 数据结构  1. ? 记号 2. ? 语法树 3. ? 符号表 4. ? 常数表 5. ? 中间代码 1. ? 临时文件 7 其他问题  2. ? 分析和综合 3. ? 前端和后端 4. ? 遍 5. ? 语言定义和编译器 1.3 程序设计语言的发展历程1.3.1 走向高级程序设计语言1.3.2 对编译器的影响1.3.3 1.3节的练习1.4 构建一个编译器的相关科学1.4.1 编译器设计和实现中的建模1.4.2 代码优化的科学1.5 编译

《东南大学 编译原理 64讲》 学习笔记

简介: 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 编译:就是将程序语言进行翻译,生成可供用户直接执行的二进制代码,即可执行文件. 全部内容大致如课程目录所示. 本视频的配套教程可以使

学编译原理须知

1.编译原理就是什么?顾名思义,“编译”就是翻译,“原理”就是在实践中得出的普遍的,一般的规律.但是,从计算机科学的角度看,我个人觉得,编译原理就是将计算机的程序设计语言进行翻译,生成可供用户直接执行的二进制代码,即可执行文件.2.学习编译原理有什么好处?对于高级程序员来说,学习编译原理可以编写出高效,稳健,占用内存少的程序.增长自己的知识.而对于普通程序员来说,掌握正则表达式,了解dfa/nfa,能读懂BNF,知道AST,会写简单的递归下降parser,会用antlr之类的parser gen