如果顺从C/C++,至少要95%的语法与C/C++相同,这样介绍CSE时要着重介绍5%的内容就可以了,否则,比方80%相同,20%不同,反倒让人更困惑。曾有一位宁波同事,在温州生活多年,怎么也说不好温州话,但他的英语与普通话都说得都很溜,属有点天份的那类,可问题就在这儿,宁波话与温州接近,说温州话老串宁波腔。
我们原型做出来后,评估了一下,只5%语法差异根本不可能构造出一个解释性语言环境,结论明朗了:确定自己的语言风格。但为什么不顺从已有脚本语言的风格呢?比如Python,原因是Python的命令式风格重了点,拿它仿真C语言操作有点困难了,仿真C++语法几乎不可行,即使选它我们也得做不少改造,同样也陷入上面80%与20%的困境。
CSE语言风格是什么呢?学过CSE的已经清楚了,他的内核语法规则非常简单,内核语法也就是CSE作为“编程语言的语言”的描述方法。而CSE的延伸规则依据适配对象不同,比方模拟C、C++、C#,还有仿JavaScript(已纳入开发计划)又能灵活衍化。这里,我们不讲衍化后CSE的表现规则,重点把内核语法的表达风格讲清楚。
1. 注释风格
CSE用“##”开始到行尾表示注释,最早期CSE曾借Python注释风格(用“#”),后来改用两个“#”号了,因为拿一门语言描述另一门语言,需要一种“超集”表达能力,标识符(即变量、函数名)不能限定于A-Z、a-z、0-9还有下划杠了,我们把“#”也纳入到常规标识中,比如uppercase#1与uppercase#2都是CSE合法函数名,翻译成C++,成为两个uppercase同名函数,这让脚本形态的函数成功模拟C++的多态函数。此外,“#”在C/C++中表示宏指令,“#”成为CSE标识符,我们便能用常规符号模拟C/C++的#define、#if等指令。赋予“#”有特殊功用后,CSE的注释就改用“##”表示了。
2.字串
CSE的字串主要顺从C/C++表达形式,主要便于C/C++程序快速切入这门语言,连续多个字串自动连接、反斜杠转义等规则与C语言相同。
CSE没采用跨行表达方式,是考虑集成界面的基于代码碎片扫描符号定义的需要。在CseWin界面中,随便写几行脚本,都容易得到输入信息提示的,比如,键入这行代码“name as TCharArray("example");”,然后键入“name.”就有该类对象的成员提示了。CSE语言设计考虑了从碎片代码扫描数据类型的需求,正在编程中的代码总是不完整的,不能依赖严谨的语法分析去得到符号定义,CSE字串不跨行方便了碎片代码的特征扫描,另外,CSE的as、declare等设计也很好支持了这一目的。
3.操作符
在CSE中,除了用户定义的变量、函数、类型声明,剩下都是操作符。从内核语言的角度,CSE没有语句,只有表达式,尽管它表面用起来可以像C/C++中的语句。而表达式由一元操作、二元操作、标记操作、变元操作构成,这4类已是全部。如new、delete是一元操作,加减乘除是二元操作,C语言的“cond?expr1:expr2”三元操作,在CSE中理解为两个二元操作的叠加,标记操作是由左标记(LNotator)开启,并由右标记(RNotator)结束的操作,如class、func等开启一个语句块,用end结束一个语句块。
变元操作则根据不同使用情况,自动转为一元、二元,或标记操作。比如“try doSomething();”中变元操作try是用作一元操作符的,但在如下句式中用作标记操作。
try: doSomething1(); doSomething2(); end;
又如,变元操作global,它单独使用时,相当于“global()”,在“global.AVar”表达式中它的作用相当于一个变量。
强调一句,上述4类操作已构成CSE“可计算”符号的全部,这在常规编语言看不到的,比如大家经常遇到数组表达式“AVar[n]”,中括号在CSE中注册为左标记,它既开启一个列表,即[n],也用作二元操作,连接AVar与[n]。再如小括号,如下用注释给出各种场合下左小括号的功能:
AFunc(arg1,arg2); ## 用作左标记符:(arg1,arg2) ## 用作二元操作符,连接 AFunc 与 (arg1,arg2) (expr) ## 用作左标记符,表示操作优先级 (expr,) ## 作左标记符,描述参数列表
当所有计算元素都精简为操作时,我们把编程语言归一化了,因为操作符是动态注册的,并非事先预置,预置意味着功能固定不变,且必须经过语法分析才发挥作用。
我们对通用语言抽象出4类操作,保障了CSE作为“编程语言的语言”的表达能力,CSE从V1版本就采用这个框架,多年来基本没变,但用仿真的语言从C、C++、OOC等一路扩展,实践证明该机制既充分自我描述,表达能力也是完备的。
介绍上面这些对了解CSE语言风格差不多了,这门语言比较规整,有据可循,它常用冒号开启一个语句块,用end结束语句块,大家学一条if句式,其它触类旁通,勿需死记。