duangsuse::Echo
718 subscribers
4.26K photos
130 videos
583 files
6.48K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from 羽毛的小白板
思考 ast transform 的写法
那个 ActionScript 的实现?
话说,duangsuse 现在还没有写过编译性的语言实现呢,这次来一个编译到 8085 汇编的编译器吧

来源语言是一门简单的四则运算语言,因为 duangsuse 对不熟悉的原因

+ - * /

只能计算 32 位有符号整数,由于 duangsuse 不熟悉啥 Combinator、啥 LL、左递归右递归的就不做扩号语法了(算了,貌似最简单的... 递归下降法应该能用吧

编译器使用 C++ 编写

目标语言是 GNUSim86 支持的 8085 汇编
并且在完成算式后自动将结果格式化输出到标准输出,真希望能使用 Libc,要不然还得自己不断和 10 除法取余转换字符串...
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from 羽毛的小白板
ActionScript 有用的只剩虚拟机,因为有字节码,可以跳过 AS 编译的环节
不会 C++ 的 duangsuse 只能用指针 + 类型标示分开子树指针于整形的区别... 而且容易出机器位长度兼容的问题
This media is not supported in your browser
VIEW IN TELEGRAM
Lexer 的事情不知道靠 scanf() 有没用了... 毕竟我没有写过这种,或许就只能读取全部到 std::string 然后再扫描了呢
「作弊」永远是解决问题的最好途径,也是我每次能最快解决问题的方式,所以我希望大家以后遇事不要先问人,先问鸭子得到答案更快
扫描的时候有编码问题...
    int c;
while ((c = getchar()) != EOF) {
code.append((const char *) &c);
}

我的锅,把指针递出去了,看看 << 操作符能不能用...
This media is not supported in your browser
VIEW IN TELEGRAM
接下来要写解析器逻辑,因为表达式都是毕竟简单的格式

因为我对 C++ 和结合实在是可以说几乎一无所知,所以暂时不做运算符优先级了,以后慢慢思考

表达式都是这样的

1 + 1 * 2 / 3
2 * 233

编译出来是这个样子(1 + 1 为例)
This media is not supported in your browser
VIEW IN TELEGRAM
我还以为 8085 按道理应该是 8086 的近亲呢... 没想到指令数目比 8086 少那么多,连除法都要用户做....
GNUSim8085 好像没有办法直接「往标准输出输出」...
无话可说
终于会用这玩意了... 真好用啊