Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

最新的 Lite AST/语法语义设计 #6

Open
duangsuse opened this issue May 10, 2018 · 5 comments
Open

最新的 Lite AST/语法语义设计 #6

duangsuse opened this issue May 10, 2018 · 5 comments
Assignees
Labels
semantic Lite semantic stupid project stupid syntax Lite syntax WIP Work In Progress

Comments

@duangsuse
Copy link
Collaborator

由于某些原因还有已经连续写了快一周这个垃圾解释器而没有成果

干脆决定彻底重写

这次我用 Gradle + Kotlin + Beaver + JFlex

这个 issue 会收集之前的 AST,语义 作为新解释器的文档
新解释器先写 AST 解释器再写 parser,并且使用 AstJson 约定,可以解析使用 Lite Json AST
而 Lite 解析器和 AST 解释器完全分开设计,解析器负责解析代码并序列化为 JSON 对象,解释器负责解析 JSON 文本和解释生成的 AST

下面会详细描述 Lite 的设计

@duangsuse duangsuse added WIP Work In Progress syntax Lite syntax semantic Lite semantic stupid project stupid labels May 10, 2018
@duangsuse duangsuse self-assigned this May 10, 2018
@duangsuse
Copy link
Collaborator Author

Lite 语法依然使用 lite.ohm 描述的语法,词法使用 scanner.flex 的词法,AST 结构不变

@duangsuse
Copy link
Collaborator Author

photo_2018-04-25_18-07-29
刚刚看到 Java 和 Android 里 JSON API 不统一,我虚了 🚶‍♂️ 算了还是不要解耦

@duangsuse
Copy link
Collaborator Author

duangsuse commented May 10, 2018

@duangsuse
Copy link
Collaborator Author

  • 内部方法调度支持 Lite fallback block
  • Fallback 方法允许向类继承树上递归查找到 java.lang.Object
  • 基于对象 hash 的 singleton Fallback 方法
  • 基于 range 的 for, index 和 range 支持
  • 支持字符串内联表达式语法糖(由 parser 处理创建带糖字符串对象)
  • 支持 varargs
  • 实现 serializable
  • 参考 BeanShell 默认加载一些 Java 包
  • 支持 or/and 操作符 (不区分关键字和操作符)
  • 二元操作中支持数值类型自动提升
  • 修复 as 表达式(优先处理数值类型转换)

Def 语法变化

https://github.com/duangsuse/Lite/wiki/Lite-1.0-%E5%88%B0-Lite-1.1-%E7%9A%84%E8%AF%AD%E6%B3%95%E5%8F%98%E5%8C%96#def-%E8%AF%AD%E6%B3%95%E5%8F%98%E6%9B%B4

def 到 Map<String, ?> (同时也是 Lite 的 Table) 中

a = { self: nil }
def a.new(obj)
  a->self { obj: obj }
  a->print { print self.obj }
aa = a.new 1 + 1
aa.print()
如果是 @a 就直接用
@a->new do |obj| 吧

Java FFI 的用途

为类创建静态方法 fallback java_lang_System!getEnv
为类创建方法 fallback join@java_lang_String
为类创建 methodMissing Missing!java_lang_Object
为对象创建单例方法 Singleton_(hashcode)

@duangsuse
Copy link
Collaborator Author

LR

新创建了个项目,打算放全新的 JSON Runtime

但是,突然感觉好累,不想去包装一个项目了,包装真的是一个很花时间的工作
配合 VCS 从开始就这样大概不合适,它会干扰到你真正的代码
还是自己做算了,做完怎么做再说

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
semantic Lite semantic stupid project stupid syntax Lite syntax WIP Work In Progress
Projects
None yet
Development

No branches or pull requests

1 participant