当前位置:   article > 正文

软件设计师2024记录-程序设计语言_1/0是动态语义错误吗为什么

1/0是动态语义错误吗为什么

二、程序设计语言

  • 低级语言:汇编语言和机器语言

  • 高级语言:Java,c++,Python…

  • 脚本语言是动态语言(也是弱类型语言),PHP,JS,Python

    在这里插入图片描述

1.编译程序和解释程序

java既是编译也是解释型

  1. 编译程序,将源语言程序翻译成等价的目标语言程序,先编译,再执行
    • 编译程序不参与目标程序的执行
  2. 解释程序,一般运用于脚本语言,立即执行源程序,并得出结果,不生成目标程序
    • 解释程序参与源程序的执行
    • 解释,程序执行速度慢

2.编译程序和解释程序过程

在这里插入图片描述

符号表:不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其存入符号表中。记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。

  1. 词法分析:识别句子中的一个个单词,输入:源程序 输出:记号流(单词符号)

  2. 语法分析:分析句子的语法结构 输入:记号流 输出:语法树

    • 语法分析可以发现程序中所有语法错误
      • 比如 变量b未声明,b = a -1;
      • 自顶向下语法分析:递归下降分析法和预测分析法,不是这两种那就属于自底向上
      • 自底向上语法分析:算符优先分析法和LR分析法
  3. 语义分析:分析句子的含义,检查是否包含静态语义错误

    • 静态语义:编译阶段检查

      • 静态语义方法:语法指导翻译

      • 静态语义错误:比如类型不匹配,int a = “123”;

    • 动态语义:运行时才能检查

      • 动态语义错误:比如被除数为0,int a = 1/0;
  4. 中间代码生成:进行初步的翻译

  5. 代码优化:对译文进行修饰

    • 常见的中间代码:后缀式、三地址码、三元式、四元式和树(图)等形式。
  6. 目标代码生成:写出最后的译文

    • 寄存器的分配工作处于目标代码生成阶段

在这里插入图片描述

for循环无限循环

3.程序设计语言的成分

  1. 数据具有类型的作用
    • 便于为数据合理分配存储单元
    • 便于对参与表达式计算的数据对象进行检查
    • 便于规定数据对象的取值范围及能够进行的运算

4.传值调用和引用调用

  1. 传值调用:将实参的值传递给形参,实参可以是变量、常量和表达式。不可以实现形参和实参间双向传递数据的效果
  2. 传引用(地址)调用:将实参的地址传递给形参,形参必须有地址,实参不能是常量(值),表达式。可以实现形参和实参间双向传递数据的效果,即改变形参的值同时也改变了实参的值。

5.正规式

在这里插入图片描述

*号表示循环(0到多次),|号表示或

正规式要能表达出相应文法,但不能多,范围不能更大

正规集可以用正规式描述,用有限自动机识别。

6.有限自动机

  1. 有限自动机是词法分析的一个工具,它能正确地识别正规集,识别一个字符后,转移一下

  2. 两个圆圈是终态,识别完后,一定在终态上

  3. 确定的有限自动机(DFA):对每一个状态来说识别字符后转移的状态是唯一的

  4. 不确定的有限自动机(NFA):对每一个状态来说识别字符后转移的状态是不确定的。比如字符为1,转移的路径有多条可以去选

7.上下文无关文法

上下文无关文法广泛的表示语言的语法规则

在这里插入图片描述

8.中缀、后缀表达式转换(优先级有些和408不同)

规则:a?b(中缀) 变 ab?(后缀)

例子:中缀:1+2 后缀:1 2 +

  • 中缀表达式怎么变后缀表达式
  1. 先看优先级,按优先级符号后置
  2. 优先级相同,从右至左看
  • a×b/(c-d) 变为 abcd-/×
  1. a×b/cd-
  2. a×bcd-/
  3. abcd-/×
  • 后缀表达式怎么变中缀表达式
  1. 利用栈

  2. abcd-/× 从左至右放入栈

  3. 遇到符号,按栈的规则将数字提出来

    栈底 abcd 栈口

    1. -号 cd出来 c-d
    2. /号 b出来 b/(c-d)
    3. ×号 a出来 a×b/(c-d)

栈在表达式求值中的应用(408的)

后缀表达式(人算)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eIT5pPaX-1683170830730)(../图片/image-20220621225803146.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N8vq4DlO-1683170814651)(../图片/image-20220621204349061.png)]

  1. 中缀表达式变后缀表达式

    • 左优先原则是怎么来的?

      ​ 计算机从左至右读取值,读到计算符号时,只能比较相邻的两个符号的优先级,不能跨符号比较。

      ​ 例上图中:A + B -C,+ 和 -遇到了,根据符号等级规则和左优先的原则去比,首先+和-的符号等级相同,那么就根据左优先原则,+号是第1位,然后 - c ,- 和 * 遇到了,则的优先级更大为第二位,再然后 - 和 /遇到了,/的优先级更大为第三位,再然后 - 和 +遇到了,根据符号等级规则和左优先的原则去比,首先+和-的符号等级相同,-在+的左边,-的优先级为第四位

      1.从左向右看,两个符号看,根据符号等级规则和左优先的原则去比,然后写好符号等级序号

      2.按符号等级排序依次转成中缀表达式

  2. 后缀表达式怎么变中缀表达式

    从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行对应运算,合体为一个操作数

    1. 利用栈

    2. abcd-/× 从左至右放入栈

    3. 遇到符号,就按栈的规则将数字提出来

      栈底 abcd 栈口 ; 未放入的元素:-/× ; 先出栈的是右操作数,后出栈的是左操作数

      1. -号 cd出来 c-d
      2. /号 b出来 b/(c-d)
      3. ×号 a出来 a×b/(c-d)
  3. 中缀表达式变后缀表达式

    • 左优先原则是怎么来的?

      ​ 计算机从左至右读取值,读到计算符号时,只能比较相邻的两个符号的优先级,不能跨符号比较。

      ​ 例上图中:A + B -C,+ 和 -遇到了,根据符号等级规则和左优先的原则去比,首先+和-的符号等级相同,那么就根据左优先原则,+号是第1位,然后 - c ,- 和 * 遇到了,则的优先级更大为第二位,再然后 - 和 /遇到了,/的优先级更大为第三位,再然后 - 和 +遇到了,根据符号等级规则和左优先的原则去比,首先+和-的符号等级相同,-在+的左边,-的优先级为第四位

      1.从左向右看,两个符号看,根据符号等级规则和左优先的原则去比,然后写好符号等级序号

      2.按符号等级排序依次转成中缀表达式

  4. 后缀表达式怎么变中缀表达式

    从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行对应运算,合体为一个操作数

    1. 利用栈

    2. abcd-/× 从左至右放入栈

    3. 遇到符号,就按栈的规则将数字提出来

      栈底 abcd 栈口 ; 未放入的元素:-/× ; 先出栈的是右操作数,后出栈的是左操作数

      1. -号 cd出来 c-d
      2. /号 b出来 b/(c-d)
      3. ×号 a出来 a×b/(c-d)
        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dRigOYuk-1683170814651)(../图片/image-20220621225803146.png)]

9.语法树中、后序遍历

中缀式:语法树中序遍历可以得出中缀式,左根右

后缀式:语法树后序遍历可以得出后缀式,左右根

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/515226
推荐阅读
相关标签
  

闽ICP备14008679号