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

来源:互联网 发布:淘宝护肤品摄影 编辑:程序博客网 时间:2024/04/27 15:28
摘要:设计扩充了新的语法,除了原来的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 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为麦芒手机锁屏密码忘了怎么办 华为麦芒5相机拍相片倒了怎么办 红米5a开不了机怎么办 华为沾了海水打不开机怎么办 华为麦芒手机忘记锁屏密码怎么办 华为手机的方框键摁不了怎么办 笔记本自动更新到一半太慢了怎么办 华为麦芒5音量下键乱跑了怎么办 麦芒6手机QQ视频没声音怎么办 18:9看16:9黑边怎么办 华为畅享7s声音小怎么办 华为畅享8手机声音小怎么办 华为畅享8plus声音小怎么办 荣耀7x锁屏密码忘记怎么办 华为荣耀7x锁屏密码忘记了怎么办 苹果耳机进水后声音变了怎么办 华为荣耀开了数据用不了怎么办 华为手机高德地图信号弱怎么办? 手机QQ浏览器看视频有广告怎么办 手机显示网络连接但不可上网怎么办 华为手机关机后开不了机怎么办 华为畅享8p相机拍照模糊怎么办 手机触屏不准怎么办荣耀青春版九 华为手机锁屏手势密码忘了怎么办 荣耀手机锁屏密码忘了怎么办 华为p20隐私空间密码忘了怎么办 安全管家隐私保护的密码忘了怎么办 华为手机自带截图键删除了怎么办 飞科电吹风吹一会就断电怎么办 住酒店时电吹风吹坏了怎么办 把话费充到停机的号码上去了怎么办 电信手机卡充值了还停机怎么办 电信手机一直没用却欠费了怎么办 苹果se开起4g信号不好怎么办 触屏华为手机充不了电怎么办 华为手机自拍出来的字反向怎么办 华为微信隐藏了怎么弄出来怎么办 酷派手机酷管家密码忘了怎么办 手机磁盘目录不具有读写权限怎么办 魅族手机像素突然变模糊了怎么办 手机忽然所有软件都没了怎么办