自制脚本语言(9) 扩充的语法

摘要:设计扩充了新的语法,除了原来的if/else/while结构和函数,增加了数组、类、接口、继承、泛型。
前面升级了GLR parser generator,就能扩充旧语法了。现在加入的语法包含三种新类型:数组、类、接口,子类继承和参数化类型(也就是泛型),另外就是支持lambda表达式,因为本来就把函数作为单独的类型,所以lambda表达式直接用函数类型来处理。下面详细介绍这些设计。

类型系统
-基本类型:int实际是64位long,double也是64位。string是双引号内字符串,character是单引号内字符
int, double, bool, string, character

-class类型及interface类型:class与interface定义方式基本与java一致。
scope_info_list class var generic_pars_list extends_list implements_list { member_def_list }
scope_info_list interface var generic_pars_list { member_def_list }


-Array类型:type_exp包括各种类型
type_exp [ ]


-Function类型:
generic_pars_list type_exp var ( par_list ) { stmt_list }

上面是对应内存结构的类型。另有表示类型的类型表达式两种:
-Identifier类型表达式:根据名称确定类型
idn_type . var

-Generic类型表达式:泛型,带参数的类型
idn_type < generic_args >


变量定义与赋值
变量的定义与赋值形式上与Java一致。并且可以用逗号将同一类型的多个变量连续定义。
type_exp var>type_exp var = expression>left_side = expression

控制结构
与主流语言一致。
if/else/while/continue/break/return

函数定义
与java基本一致,包括了泛型函数。但这里有个问题,函数体内是否可以定义函数、类、接口等?语法上是允许的(为将来留个后门),但是目前不确保得到正确的结果,因为有变量可见域和访问链的问题,还有函数闭包,暂时还不打算支持这么复杂的语义,因为可能引起定义的混乱。所以结论是现在不要嵌套定义函数。
generic_pars_list type_exp var ( par_list ) { stmt_list }

数组定义
与java基本一致。包括了{ }括号内的初始化定义方式。
new_array_exp -> new type_exp dim_list | { array_init_list }
array_init_list -> array_init_list , array_init | array_init
array_init -> calc_exp | { array_init_list }

类与接口定义
与java接近。但目前不支持内部类、匿名内部类等。也暂时不支持自定义构造和析构函数。初始化只有new之后手动修改field。
member_def -> member_def field_def | member_def method_def | field_def | method_def 
field_def -> scope_info_list var_def ;
method_def -> scope_info_list func_def

继承与多继承
与java一致。单继承,多接口实现。


数据可见区域
public、private、static. 但是暂时只保留了包的语法解析,不支持包和import的实现。


泛型类与泛型函数
语法与java基本一致,但是泛型参数只支持“? extends”而没有“? super”。也不打算采取类型擦除,而是保留泛型类型信息在run-time中。


表达式

与java接近。但省略了很多种运算符。基本分为new_array_expression, new_class_expression, primary_expression, unary_expression, binary_expression, lambda_expression这几种。 详见github项目内grammar.txt文档。


lambda表达式
语法上与java基本一致。但采取动态类型的语法,字面上的类型都是function,实际上类型系统会推导出正确的类型。例如这样定义变量f: function f = lambda_expression
( par_list ) -> { stmt_list }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值