设计目标1Jer语言(1):语法设计闲话编程小实现Contents设计目标 ............................................................................................... 1Jer 语法 ................................................................................................ 2导入申明常量定义方法抽象类和自定义类型数据类型基本数据类型数组类型表达式代码示例 ............................................................................................... 6最近准备实现一个基于的新语言,一开始想先实现一个,然后逐步再朝上面添加新的功能;后来觉得还是需要先把这个语言的语法层面大致设计好再动手才行。本身是出于好玩的一个目的,但是也的确希望这个语言有一些特点,而不是单纯换一个语法而已。在这个期间思考了很多,但一直没有想到自己满意的方法,姑且先按照现在的想法设计一版出来吧。设计目标我对这个语言有这些期望:基于平台,即最终通过代码编译生成字节码跟能够兼容(可以互相调用)尽量简单,应该基本的数据类型、流程控制等,支持,但对于一些高级特性例如泛型、等就不考虑了依然是强类型的语言hello world类似这样一个文件只能对应一个类也许不是也个好的办法,源文件中可以申明任意数量的类。对于一个来说,大概)应该长这样子:// 导入其他类或者其中的静态方法use jer/lang/System// 没有定义在类中的方法对应到java中的静态方法main(args: [String) = { msg: String = "hello world!" println(msg)}其中,不需要使用分号作为行的分隔符,直接换行就行了。一个源文件即对应到一个的类,类的名称即是文件名。 Jer 语法2Jer 语法compilationUint : importedType* declaration* EOF ;declaration : constantDeclaration | methodDeclaration | abstractDeclaration | typeDeclaration ;每一个文件中,可以包含任意:导入申明常量变量申明方法申明(即为静态函数)或者类的申明导入申明通过导入申明来引入其他包或者文件中定义的类。importedType : USE fullPath ;fullPath : (IDENTIFIER '/')* TYPE_NAME ;use java/lang/Stringuse java/util/DateTime这里需要考虑一个场景就是,如果是其他文件中定义了常量或者静态方法,在其他文件中如何使用?// com/riguz/jer/Util.jersum(a: Integer, b: Integer) -> Integer = { // ...}// com/riguz/jer/Foo.jeruse com/riguz/jer/Utilmain(args: [String) = { sum(1, 20)}常量定义常量定义跟普通的局部变量唯一的区别就是多了一个的关键字。具体的语法在后面介绍。constantDeclaration : CONST variableDeclaration ; Jer 语法3方法methodDeclaration : methodSignature methodImplementation? ;methodSignature : IDENTIFIER '(' formalParameters? ')' functionReturnType? ;formalParameters : formalParameter (',' formalParameter)* ;functionReturnType : TO type ;methodImplementation : '=' block ;formalParameter : IDENTIFIER ':' type ;方法分为两种,一种是有返回值的方法,另一种是没有返回值的方法(),在定义的时候稍微有些区别:// 没有返回值的方法依靠方法的副作用main(args: [String) = { msg: String = "hello world!" println(msg)}// 返回值通过箭头表示sum(a: Integer, b: Integer) -> Integer = { return a + b}抽象类和自定义类型abstractDeclaration : ABSTRACT TYPE_NAME '{' propertyDeclaration* methodSignature*'}' ;typeDeclaration : TYPE TYPE_NAME typeAbstractions? '{' propertyDeclaration* constructorDeclaration* methodDeclaration*'}' ;typeAbstractions : IS TYPE_NAME (',' TYPE_NAME)* ;propertyDeclaration : IDENTIFIER ':' type ;constructorDeclaration : '(' constructorFormalArguments? ')' methodImplementation ;constructorFormalArguments Jer 语法4 : constructorFormalArgument (',' constructorFormalArgument)* ;constructorFormalArgument : IDENTIFIER (':' TYPE_NAME)? ;数据类型type : TYPE_NAME | arrayType ;arrayType : '[' type ;基本数据类型数据类型与基本一致,对应到的各个数据类型:取消中的类型,即所有一切都是引用类型。数组类型数组类型用[<Type>表示,例如[Integer即表示一个整数数组。表达式expression : primary | expression bop='.' ( methodCall | IDENTIFIER ) | methodCall | objectCreation ;primary : '(' expression ')' | literal | IDENTIFIER ;literal : DECIMAL_LITERAL | FLOAT_LITERAL Jer 语法5 | CHAR_LITERAL | STRING_LITERAL | BOOL_LITERAL | NULL_LITERAL ;methodCall : instance=IDENTIFIER? '('methodName=IDENTIFIER methodArguments? ')' ;methodArguments : expression (',' expression)* ;objectCreation : NEW '(' methodArguments? ')' ;statementblock : '{' statement* '}' ;statement : variableDeclaration | embeddedStatement ;embeddedStatement : block | assignment | expressionStatement | selectionStatement | loopStatement | returnStatement ;assignment : IDENTIFIER '=' expression ;selectionStatement : IF '(' expression ')' statement (ELSE statement)? ;loopStatement : WHILE '(' expression ')' statement ;returnStatement : RETURN expression ;expressionStatement : methodCall ;variableDeclaration : IDENTIFIER ':' type ('=' variableInitializer)? ;variableInitializer 代码示例6 : arrayInitializer | expression ;arrayInitializer : '{' variableInitializer (',' variableInitializer)* '}'代码示例use java/lang/Stringuse java/util/DateTimeconst pi: Float = 3.1415926fconst msg: String = "hello world"const kb: Integer = 1024const success: Boolean = trueconst id: Long = 12345678main(args: [String) = { (println "Hello world")}circleArea(radius: Float) -> Float = { return pi(multiply 2, radius)}abstract Movable { x: Integer y: Integer move(x1: Integer, y1: Integer)}abstract Animal { name: String sayHelloTo(person: Person) address() -> String}type Dog is Animal, Movable { (name) = { x = 0 y = 0 } sayHelloTo(person: Person) = { (println "Hello") }}