<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.riguz.com/index.php?action=history&amp;feed=atom&amp;title=Jer_lang_grammar_design</id>
	<title>Jer lang grammar design - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.riguz.com/index.php?action=history&amp;feed=atom&amp;title=Jer_lang_grammar_design"/>
	<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Jer_lang_grammar_design&amp;action=history"/>
	<updated>2026-06-15T09:40:31Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.riguz.com/index.php?title=Jer_lang_grammar_design&amp;diff=3775&amp;oldid=prev</id>
		<title>Riguz：​Riguz移动页面Blog:Jer语言(1)：语法设计至Jer lang grammar design，不留重定向</title>
		<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Jer_lang_grammar_design&amp;diff=3775&amp;oldid=prev"/>
		<updated>2023-12-19T05:57:15Z</updated>

		<summary type="html">&lt;p&gt;Riguz移动页面&lt;a href=&quot;/index.php?title=Blog:Jer%E8%AF%AD%E8%A8%80(1)%EF%BC%9A%E8%AF%AD%E6%B3%95%E8%AE%BE%E8%AE%A1&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Blog:Jer语言(1)：语法设计（页面不存在）&quot;&gt;Blog:Jer语言(1)：语法设计&lt;/a&gt;至&lt;a href=&quot;/Jer_lang_grammar_design&quot; title=&quot;Jer lang grammar design&quot;&gt;Jer lang grammar design&lt;/a&gt;，不留重定向&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2023年12月19日 (二) 05:57的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;zh-Hans-CN&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;（没有差异）&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key wiki_db:diff:1.41:old-2532:rev-3775 --&gt;
&lt;/table&gt;</summary>
		<author><name>Riguz</name></author>
	</entry>
	<entry>
		<id>https://wiki.riguz.com/index.php?title=Jer_lang_grammar_design&amp;diff=2532&amp;oldid=prev</id>
		<title>imported&gt;Riguz：​最近准备实现一个基于JVM的新语言&quot;Jer&quot;，一开始想先实现一个Hello world，然后逐步再朝上面添加新的功能；后来觉得还是需要先把这个语言的语法层面大致设计好再动手才行。本身是出于好玩的一个目的，但是也的确希望这个语言有一些特点，而不是单纯换一个语法而已。在这个期间思考了很多，但一直没有想到自己满意的方法，姑且先按照现在的想法设计一版出来吧。</title>
		<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Jer_lang_grammar_design&amp;diff=2532&amp;oldid=prev"/>
		<updated>2021-01-05T00:00:00Z</updated>

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