分享 做了个玩具语言 Cirru

jiyinyiyong · 2013年10月16日 · 最后由 kgtonglousy 回复于 2014年02月13日 · 8498 次阅读
本帖已被管理员设置为精华贴

CoffeeScript 死党,缩进语法死党,,, 一直想自己做的脚本... 现在好歹有一个了,(解析技巧太低级,正在找学长恶补...), 目前的解释器 https://github.com/jiyinyiyong/cirru-parser/blob/master/coffee/parse.coffee#L8 代码的预览.. https://github.com/jiyinyiyong/cirru-interpreter/tree/master/test/feature

echo ==== testing control flows

set a $ number 1
set b $ number 2
set c $ number 1

if (equal a b)
  echo a equals b
  echo a not equals b

if (equal a c)
  echo a is c

if (equal c b)
  echo b is c

print $ begin
  print (number 1)
  string somthing
  number 0

语法极端简化

  • 圆括号表达了表达式的嵌套关系,但括号不允许跨行
  • 缩进语法表示了表达式的嵌套关系,用来取代跨行的嵌套关系
  • 为了减少缩进和闭括号泛滥,增加了 $ 添加到行尾或者缩进结尾的嵌套
  • 顶层的表达式裸露不嵌套
  • 一般空格分隔开可以是语法以外所有符号的 token, 但可以用双引号转义

具体其他说明移步:http://jiyinyiyong.github.io/blog/posts/131004-cirru-status.html

自己玩得比较开心,但编码技巧上无力吐槽,, 不知道对他人是否有可取的地方...

再带两张图片,Sublime 上的代码高亮


Some update...

重写了 parser, online demo... http://jiyinyiyong.github.io/cirru-parser/html/ Code: https://github.com/jiyinyiyong/cirru-parser JSON 格式规则:https://github.com/jiyinyiyong/compact-json

编译到 Mustache (aka HTML...) https://github.com/jiyinyiyong/cirru-to-mustache Demo in Chrome http://jiyinyiyong.github.io/cirru-to-mustache/

比较原始 CodeMirror 语法高亮: https://github.com/jiyinyiyong/cirru-mode

做出来了呀,cool!

其实非 algo style 的方法调用 + 缩进语法的细节上是有些不好搞的,haskell parser 去斟酌的话就会发现很多蛋疼的地方...

#1 楼 @luikore Algo style 是说 f(a, b) 形式的调用吗? 复杂的 parser generator 还没学会用,是手写的,难维护了

#2 楼 @jiyinyiyong 其实很多语言都会迁移到手写的 parser 上面 (ruby 这么迁移的话有点搞不动,python 反过来从手写的迁移到 antlr 上了...), parser generator 总有一些封得太好难以控制的地方,对于控制狂来说是接受不了的...

是的 algo style 的长处是逗号作为分隔有减少括号的作用,一个词是调用函数还是引用局部变量也容易分辨。

能真的实现就已经很不错了,如果想要实现复杂的语法,可以用 flex+bison 来简化前段的设计。

#3 楼 @luikore 一些怪想法还好够支撑玩下去的.. 关于做脚本给些建议不?:P

#5 楼 @jiyinyiyong 现在是有解释器了还没编译器?不管是边解析边解释,还是执行 AST, 都比编译慢很多的。做编译器的话就生成一段 javascript eval 成个函数,执行速度会比解释器快很多,我没试过目标是 javascript 的,不知道编译时跳过 AST 这一步直接搞 DAG 是否可行,可以的话就更效率了。

如果你要支持数组字面量,数组中间可能也要像 haskell 那样加逗号...

[foo bar, baz]

无括号 lisp 一直都是程序员的梦想之一,例如 http://readable.sourceforge.net/ 不过它那个花括号还是挺丑的... 如果想要解析中缀运算符的速度快一些的话,可以考虑那个算法 https://en.wikipedia.org/wiki/Operator-precedence_parser , bison 也是用这个的。递归下降解析器也可以用一些技巧例如 tabular caching 来提高处理中缀运算符的速度... 不过还是先把 feature 设计好了再慢慢想优化吧。

#6 楼 @luikore 解释执行,原理依然类似 Peter Norvig 的 lispy 解释的过程. 数组的语法是 array (number 1) (string ss) variable, 上边几条规则已经包括全部语法了,全是前缀表达式.. 有点偏执的.. 完了,我学长看了都误解的.. 语法设计太另类 >_<

#1 楼 @luikore APL! APL! APL!!!

不要缩进了,一行搞定啥问题都没有了

cooooooooooooooooooooooool

cooooooooooooooooooooool

#12 楼 @jjym 实现代码技巧太弱诚惶诚恐啊..

楼上都看上 Cirru 哪个部分了?

哈哈,你们是想干什么

我对楼主的 sublime 的主题感兴趣,能否告知名字和下载点?

@jiyinyiyong 感谢,原来是自带的 color theme。

方便問一下,不使用 jisonpegs.js 有什麼特別理由嗎?

#20 楼 @changtimwu 尝试过用 pegjs, 还留了点笔记 http://blog.segmentfault.com/jiyinyiyong/1190000000322401 https://github.com/jiyinyiyong/cirru-pegjs/commits/master 主要原因是... pegjs 解析缩进有点难,我基础不好,没能搞定 另一个原因是 Cirru 这套语法简洁到怪异,用 pegjs 生成代码略多,我觉得不大必要

/play trombone

我来更新一下进展。http://cirru.org

25 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号