首页 > 其他分享 >求导工具和语法分析

求导工具和语法分析

时间:2023-04-29 09:34:05浏览次数:37  
标签:语法分析 函数 IR let 求导 型文法 工具 Rightarrow

最近想用编译原理的思想和现代化类库来重构我大一写的函数求导器
仓库

思想&语法

在这里函数是真正的一等公民

  • 变量的本质是数学函数
  • 编程层面的函数需要引入多元函数,但是没必要
  • 复杂的数据结构诸如链表,数组在这里是不存在的。如果需要存在,那么借鉴图灵机的做法,将用一个数字来显式表示数据结构的内存空间和类型,接着再用多元函数定义的读取方式。这个已经超出数学函数的范畴

约束


  • 大小写敏感
  • 行分隔符

核心词法


  • 关键字
    • x 定义函数的唯一关键字
    • ln
    • exp 和标识符e区分
    • let 用于函数的组合
    • fn 定义函数
    • ' 数学求导符号,

  • 内嵌函数
    • print 打印函数的值或者结果
    • dre 对函数进行求导

  • 标识符 /\a+\w*/
  • 行拆分
  • 换行

核心语法

赋值语句

  • 函数定义

    let f = x^5 + 3;

  • 变量定义

    let b = f * x + 3;

  • 嵌套调用

    let c = b(x^2) + 1;

  • 变量嵌套

    let d = c(c(c));

  • 函数求导

    let e = d'';

  • 嵌套求导

    let f = e''(a');

开发感想

考虑到c内存管理困难和库比较少,一开始考虑的是rust。但是rust的yacc和lex实在有点不堪(没错只能写右递归无二义文法),因此回到了c

数据结构

语法数的数据解构用的是二叉树,但实际是是glib的链树当成二叉树使用。由于该语言表达式是一等公民,因此语法树向上冒泡传的是表达式而非值,表达式一边冒泡一边做基本运算,最后算出右值

树上操作

求导

考虑如下求导文法:

\[a+b' \Rightarrow a'+b'\\ ab' \Rightarrow a'b+ab' \\ ... \]

(定义求导符号优先级最低)

可以看出这是一个一型文法,属于扩张性操作,因此使用mutable写法

格式化

一般是合并同类项和除0,除1

\[a \circ Zero \circ b \Rightarrow Zero \\ a+Zero+b \Rightarrow a+b \\ ... \]

可以看出这是一个零型文法,属于收缩操作。由于使用的是二叉树,每一次格式化和合并同类项必须要替换子树。使用immutable写法比较简单

图灵机和零型文法

众所周知,编译器的工作流程如下

  1. 将高级语言转化为IR
  2. 将IR转化为机器码

转化为IR的流程如下

  1. token分词(三型文法)
  2. 控制流转ast(二型文法)
  3. ast转IR(零型文法为主)

这里lex和yacc分别使用自动机和自底向上的栈规约实现了1和2, 3就需要我们自己手写代码来完成语义制导。而语义制导依靠的就是我们的计算机(即图灵机)来实现。这也是为何ast是一种递归数据结构。

标签:语法分析,函数,IR,let,求导,型文法,工具,Rightarrow
From: https://www.cnblogs.com/www159/p/17363580.html

相关文章

  • 【愚公系列】2023年04月 .NET CORE工具案例-.NET Core使用MiniWord
    (文章目录)前言MiniWord模板引擎的主要功能是根据模板,生成对应的Word文档。支持跨平台,项目采用类似Vue、React模板方式,在模板定义相应的变量,再结合数据,快速生成Word文件。MiniWord官网:https://github.com/mini-software/MiniWord一、.NETCore使用MiniWord1.安装包MiniWord......
  • Wireshark工具的使用
    1.0【实验目的】了解Wireshark、TCP协议的概念,掌握Wireshark抓包工具的使用、FTP的搭建和登录,学会对Wireshark抓包结果的分析。2.0【知识点】Wireshark3.0【实验原理】Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最......
  • Win32 API从磁盘文件图片创建工具栏图标
    关键字:Win32API从磁盘,文件,图片创建工具栏图标,包含提示文字。编译命令:g++demo01.cpp-mwindows-lcomctl32-ldwmapi-odemo01-static-Wall-std=c++11#defineUNICODE#include<Windows.h>#include<strsafe.h>#include<commctrl.h>/******CALLBACK代表__stdcall......
  • win工具/控制面板集合
    <html><head><metahttp-equiv=content-typecontent="text/html;charset=gb2312"><title>qidizi工具集</title><style>body{margin:0px0px0px0px;}#leftWin{font-size:15px;width:......
  • 盘点高效实用的AI工具——搜嗖工具箱
    如今这个数字化时代,AI(人工智能)的发展经历了一个爆炸性的增长。AI不仅在科技领域大放异彩,还在各行业得到了广泛的应用,为我们的生活带来了很多便利。实用AI工具,更是应用到了人们生产生活的各个领域,帮助我们提高工作效率和实现更好的生活,今天就为大家盘点一下好用的AI工具有哪些!Gram......
  • Python_Gooey和pyinstaller打造易用的工具
    Python沟通Python搭建GUI界面时,首选Gooey,然后PyQt5和Tkinter,Pyinstaller:--paths后接第三方模块的路径,多个路径直接用逗号分隔(英文逗号)-F后接源文件路径使用-F,只生成一个大的可执行文件--clean表示清理打包完成后的临时文件(可选,但建议写上)......
  • 小鹅通视频课件课程下载工具,如何在电脑端下载小鹅通频课件PDF,PPT到本地
    一.安装小鹅通下载器1.获取学无止下载器https://www.xuewuzhi.cn/xiaoetech_downloader2.下载安装后,然后点击桌面快捷方式运行即可。注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。二.使用说明1.学无止下载器介绍学无......
  • 工具适配新系统平台笔记
    适配过程中需要安装的东西(包括但不限于):yuminstall-ygcc-c++yuminstall-yboost-develyuminstall-ylibaio-devel适配过程遇到的问题:默认snappy版本较新(使用了c++11的语法),gcc编译器无法编译(指定了-std=gnu++98)解决方法:将snappy1.1.7版本的devel和lib的rpm(老版本)......
  • 十个最好的Java性能故障排除工具
    推荐十个最好的Java性能故障排除工具:1.jconsole是随着JDK1.5而推出的。这是一个Java监测和管理控制台-JMX兼容的图形工具来监测Java虚拟机。它能够同时监测本地和远程的JVMs。详情可查看:jconsole工具介绍2.VisualVM集成了几个现有的JDK软件工具,轻量级内存和CPU信息概要能力。......
  • 用Leangoo看板工具做可视化工作流管理
    ​本场景是可视化工作流,通过可视化的精益看板将价值流进行可视化,通过精益思维消除瓶颈、加速流动,提升效率。创建工作流任务看板•通过Leangoo可视化工作流项目模板,创建一个工作流看板。•通过看板,我们可以将整个价值流进行可视化​编辑设计工作流在Leangoo看板中,以列表体现......