码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 几百行代码实现一个脚本解释器


    前言

    最近又在重新学习编译原理了,其实两年前也复习过,当初是为了能实现通过 MySQL 的 DDL 生成 Python 中 sqlalchemy 的 model。


    相关文章在这里:手写一个词法分析器

    虽然完成了相关功能,但现在看来其实实现的比较糙的,而且也只运用到了词法分析;所以这次我的目的是可以通过词法分析->语法分析->语义分析 最终能实现一个功能完善的脚本"语言"。

    效果

    现在也有了一些阶段性的成果,如下图所示:

    目前具备以下基本功能:

    • 变量声明与赋值(只支持 int)
    • 二次运算(优先级支持)
    • 语法检查
    • debug 模式,可以打印 AST

    感兴趣的朋友可以在这里查看源码:
    https://github.com/crossoverJie/gscript

    本地有 go 环境的话也可以安装运行。

    go get github.com/crossoverJie/gscript
    gscript -h
    

    或者直接下载二进制文件运行:https://github.com/crossoverJie/gscript/releases

    实现

    当前版本是使用 go 编写的,确实也如标题所说,核心代码还不到 1k 行代码,当然这也和目前功能简陋有关。

    不过麻雀虽小五脏俱全,从当前版本还是运用到了编译原理中的部分知识:词法、语法分析。

    基本实现流程如上图:

    • 通过词法分析器将源码中解析出 token
    • 再通过对 token 推导生成出抽象语法树(AST)
      • 如果语法语法出现错误,这一步骤便会抛出编译失败,比如 2*(1+ 少了一个括号。

    因为没有使用类似于 ANTLR 这样工具来辅助生成代码(不然功能也不会只有这么点),所以其中的词法、语法分析都是手写的,代码量并不大,对于想要调试的朋友可以直接查看源码。

    词法分析器:token/token.go:39
    语法分析器:syntax/syntax.go

    其中会涉及到一些概念,比如有限状态机、递归下降算法等知识点就没在本文讨论了,后续这个项目功能更加完善后也会重头整理。

    规划

    最后是画饼阶段了,不出意外后续会继续新增如下功能:

    • 更多的基础类型,string/long 之类的。
    • 变量作用域、函数。
    • 甚至是闭包。
    • OOP 肯定也少不了。

    这些特性都实现后那也算是一个"现代"的脚本语言了,后续我也会继续更新学习和实现过程中的有趣内容。

    源码地址:
    https://github.com/crossoverJie/gscript

  • 相关阅读:
    javaScript 计算以过去的时间
    Mysql的四个隔离级别是如何实现的 (简要)
    普通人如何通过自媒体年入百万?
    【ansible】自动化运维ansible之playbook剧本编写与运行
    一个Python的轻量级搜索工具--Whose
    LeetCode刷题笔记【29】:动态规划专题-1(斐波那契数、爬楼梯、使用最小花费爬楼梯)
    仿细胞膜结构交联改性聚乳酸纳米颗粒PLA NPs/红细胞膜包裹盘状纳米载体
    网络学习总结
    Visual Leak Detector内存泄漏检测机制源码剖析
    寻找左下角的值leetcode题解513-前序遍历递归法
  • 原文地址:https://www.cnblogs.com/crossoverJie/p/16330067.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号