数学表达式编译器
‘壹’ 数学公式编辑器有哪些
推荐使用mathtype吧,MathType是Word中公式编辑器的升级版本,在功能上不仅延续了Word原有的功能,还增添了大小属性页工具栏,可以重输入更多的模板公式。MathType是一款专业、功能强大的数学公式编辑工具,同时支持Windows和Macintosh操作系统,与文字处理软件有很好的兼容性,可在各种文档中加入复杂的数学公式和符号。
MathType公式编辑器软件主要使用用户为初中、高中以及大学的学生、老师, 理科专业工作者,可用于编辑数学试卷、书籍、报刊、论文、幻灯演示等方面,是编辑数学、物理公式资料的必备工具,也是一款必不可少的教育教学软件。该软件作为一款功能强大的数学公式编辑器,一直深受广大用户的喜爱,给很多的理科生和各位学者、教研机构等带来巨大帮助。Mathtype使用人群主要集中在学生教师以及理科专业工作者,可应用于教育教学、科研机构、工程学、论文、写作、期刊排版、编辑理科试卷等。
mathtype下载地址:网页链接

‘贰’ 编译器笔记34-中间代码生成-布尔表达式的回填
基本思想:生成一个跳转指令时,暂时不指定该跳转指令的目标标号。这样的指令都被放入由跳转指令组成的列表中。同一个列表中的所有跳转指令具有相同的目标标号。等到能够确定正确的目标标号时,才去填充这些指令的目标标号。
B.truelist:指向一个包含跳转指令的列表,这些指令最终获得的目标标号就是当B为真时控制流应该转向的指令的标号。
B.falselist:指向一个包含跳转指令的列表,这些指令最终获得的目标标号就是当B为假时控制流应该转向的指令的标号。
为了处理跳转指令的列表我们构造了三个函数
上述的布尔表达式将被翻译成两条跳转指令。两条跳转指令的标号都不填写因为这两条跳转指令的标号都在等待回填,因此我们要把它放到相应的列表中。
第一条跳转指令的目标标号是B的真出口,因此我们把它放到B.truelist中。调用makelist函数生成一个只包含nextquad的列表,并把这个列表的指针赋值给truelist,这里的nextquad是指即将生成的下一条指令的标号,即gen('if' E1.addr relop E2.addr'goto_')这条指令的标号。
第二条跳转指令的目标标号是B的假出口,因此把这条跳转指令存放到B.falselist中。因此我们调用makelist函数生成一个只包含nextquad+1这样一个标号的列表,nextquad+1标号就是gen('goto_')这条指令的标号。
这样的话我们就将这两条指令分别放入到B.truelist和B.falselist中。
问:list中存的是对应跳转指令的标号?
当B定义为true时,此时可以确定布尔表达式的值为真,生成一条跳转到B的真出口的一条指令。由于此真出口的标号不能确定有待回填,我们把它放入到B.truelist中。
当B定义为false时,此时可以确定布尔表达式的值为假,生成一条跳转到B的假出口的一条指令。由于此真出口的标号不能确定有待回填,我们把它放入到B.falselist中。
对B的翻译与其对应的子表达式B1的翻译是相同的,因此B的属性值等于B1的属性值。
B的值与B1的值正好相反,因此将两个非终结符的属性进行对调。
B1.truelist中的这些指令都要跳转到B1的真出口,当B1为真的时候整个表达式的值就是为真的,因此B1的真出口就是B的真出口。要跳转到B1的真出口就是跳转到B的真出口,因此B1.truelist中的指令都要放到B.truelist中。
B2.truelist的指令都要跳转到真出口,当B2为真时整个表达式的值也为真,因此B2的真出口就是B的真出口。要跳转到B2的真出口就是要跳转到B的真出口,因此B2.truelist中的指令都要放到B.truelist中。
B1.falselist中的指令它们都是要跳转到B1的假出口,当B1的值为假的时候我们要进一步判断B2的值,因此B1的假出口就是B2的第一条指令,因此B1.falselist中的指令都要跳转到B2的第一条指令。
B2.falselist中的指令都要跳转到B2的假出口,当B2的值为假的时候那么整个布尔表达式的值也是假的。因此B2的假出口就是B的假出口,要跳转到B2的假出口也就是要跳转到B的假出口。B2.falselist中的指令都要放置到B.falselist中。
根据此示意图可以看出,在分析B2之前,要用B2的第一条指令的标号来回填B1.falselist中的各条指令。当然我们可以记录下B2的第一条指令的标号在归约时完成此回填动作。为了记下B2第一条指令的标号我们在非终结符B2之前插入一个标记非终结符M。与M关联的语义动作它的任务就是记录下B2的第一条语义动作的标号。我们给M设置一个综合属性quad,M.quad等于下一条指令的标号。因为我们把M放在B2之前,因此M.quad记录的是第二条指令的标号。根据翻译方案示意图,我们要用M.quad来回填B1.falselist中的各条指令,因此调用backpatch用M.quad回填B1.falselist中的各条属性。B.truelist是由B1.truelist和B2.truelist合并而成的,因此我们调用merge函数将B1.truelist和B2.truelist进行合并,将合并后的指针赋值给B.truelist。
注:因为这里我们定义的都是综合属性,从左向右扫描输入串。makelist函数生成一个只包含下一条指令的列表,并把指针赋值给B.trulist。我们假设下一条指令从100开始。gen(‘if ’ E 1 .addr relop E 2 .addr ‘goto _’)中E1.address等于a,relop就是小于号,E2.address等于b,引号中的字符串按字面值传递。下划线表示待回填的目标标号。
注:将栈顶中的空串归约成一个标记非终结符M
注:有四条指令是等待回填的,在B的truelist中有两条指令100和104,当B的真出口确定以后我们将用B的真出口的标号这两条指令。同理当B的假出口确定以后将会用B的假出口的标号回填此两条指令。
‘叁’ C语言 什么是表达式
C语言表达式的定义是:用C语言运算符将运算对象连接起来的式子,就叫表达式。
C语言在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。
当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则就会显得十分重要。
基本构成:
数据类型:C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。
常量与变量:常量其值不可改变,符号常量名通常用大写。
变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名。变量在编译时为其分配相应存储单元。
数组:如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NULL作为数组的结束。要特别注意的是,中括号内的索引值是从0算起的。
指针:如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同。C语言中另有 双目运算符 *) 则是取内容操作符,意思是取这个内存地址里存储的内容。指针是 C 语言区别于其他同时代高级语言的主要特征之一。
指针不仅可以是变量的地址,还可以是数组、数组元素、函数的地址。通过指针作为形式参数可以在函数的调用过程得到一个以上的返回值,不同于return(z)这样的仅能得到一个返回值。
字符串:C语言的字符串其实就是以'
