Skip to content

Lite 1.0 到 Lite 1.1 的语法变化

duangsuse edited this page May 7, 2018 · 7 revisions

Lite 1.0 -> 1.1 版本升级 See Also

新版本使用了手写的 Lexer 和 Deflator(为使用缩进的语义添加 end

使用 PEG.js 作为解析器生成器, 目标是生成序列化 JSON,需要使用的时候让解释器反序列化得到 AST

使用 JavaScript 解析器生成器,使用 Json 在 Java 和 Js 之前交换 AST 数据结构

使用松耦合解析器(Reflect 调用解析器),允许将 Lite 代码文本「编译(解析)」成 AST JSON, 执行时加载

分别为 Android 和 JavaSE 平台实现 JS 解析器接口

内部方法调度支持 Lite fallback block

lay << @text # 这是 Lite 1.1 的语法, AST 解释器的内部隐式方法调用支持内部实现 def LinearLayout$add ..... 内部特殊方法调用支持 Lite fallback

Why?

提供了 Lite 的部分运算符重载特性,允许 Lite 拥有更优雅的语法

def System.getEnv # Java 这里比较 emmmmm.... 没有用标准的方法名风格
  return System.getenv() # Just an alias of System#getenv

System.env::HOME #=> "/home/dse"
# instead of
System.getEnv::HOME

import android.widget
import android.view
def LinearLayout.add(view)
  self.addView view

def Button.new
  return Button(ctx) # or Button(lite[:ctx])

layout << Button.new
# instead of
layout.addView(Button(ctx))

Fallback 方法允许向类继承树上查找到 java.lang.Object

def Object.eq? other
  return self.equals other

基于 range 的 for 和 range 支持

for i in 1..4

添加了一个创建 LiteRange 的二元操作符 .. 1..2 2..a 0..(1 + 1)

这个不解释,没啥好解释的

支持 case 语句

case input.text
"OC<"
puts ""
contains "foo" exit
nil exit if false
length(0) puts "${input.text}"

支持字符串内联表达式语法糖(由 Lexer 处理脱糖)

"$variable" "${expression}"

高级的块参数填充(*varargs/name=default)

puts "Hello" "Word\n"

参考 BeanShell 为解释器实现 Java 接口 (java.io.Serializable, 从 Object 类实现部分应该重载的方法)

  • Interpreter 类需要实现 Serializable

参考 BeanShell 默认加载一些 Java 包

  • java.lang 你们肯定没意见
  • LuaJava 和 BeanShell 的部分导入

裁剪合适的语法

  • trace 1 trace 有何德能作为关键字
  • import 后面是不用加 '' 的 string

其他

  • 内建 AST Formatter 支持缩进格式化

  • 提高内部代码重用数量

  • 写好 JavaDoc

  • 为实现过程写尽可能多的注释

  • 完全测试(但不测试驱动开发)

  • 包装好,使用 CI(后事)

  • 为代码文本处理部分添加 Deflator 和 JsonAst 类