11# GödelScript 查询语言
22
3+ ## 目录
4+
5+ - [ GödelScript 基本概念和语法] ( #gödelscript-基本概念和语法 )
6+ - [ 简介] ( #简介 )
7+ - [ 基本程序构成] ( #基本程序构成 )
8+ - [ 基础类型和编译器内建函数] ( #基础类型和编译器内建函数 )
9+ - [ 函数] ( #函数 )
10+ - [ 语句] ( #语句 )
11+ - [ Schema] ( #schema )
12+ - [ 数据库] ( #数据库 )
13+ - [ Trait] ( #trait )
14+ - [ Import] ( #import )
15+ - [ Query] ( #query )
16+ - [ Ungrounded Error: 未赋值/未绑定错误] ( #ungrounded-error-未赋值未绑定错误 )
17+ - [ 查询示例] ( #查询示例 )
18+ - [ Java] ( #java )
19+ - [ Python] ( #python )
20+ - [ JavaScript] ( #javascript )
21+ - [ XML] ( #xml )
22+ - [ Go] ( #go )
23+ - [ 查询调试和优化技巧] ( #查询调试和优化技巧 )
24+ - [ Schema 传参导致笛卡尔积过大] ( #schema-传参导致笛卡尔积过大 )
25+ - [ 多层 for 导致笛卡尔积过大] ( #多层-for-导致笛卡尔积过大 )
26+ - [ 不要滥用` @inline ` ] ( #不要滥用inline必须用inline的优化策略 )
27+ - [ 在本机使用查询脚本流程] ( #在本机使用查询脚本流程 )
28+
329## GödelScript 基本概念和语法
430
531### 简介
@@ -30,13 +56,13 @@ GödelScript 编译器主要应用场景为:
3056
3157GödelScript 程序可能包含:
3258
33- - 模块和符号 [ 引用语句 ] ( #import )
34- - Schema [ 类型声明] ( #schema )
35- - 数据库 [ 类型声明 ] ( #数据库 )
36- - Trait [ 声明] ( #trait )
37- - [ 方法实现] ( #方法实现 )
38- - 函数 [ 声明和实现 ] ( #函数 )
39- - Query [ 声明] ( #query )
59+ - [ 模块和符号引用 ] ( #import )
60+ - [ Schema 类型声明] ( #schema )
61+ - [ 数据库类型声明 ] ( #数据库 )
62+ - [ Trait 声明] ( #trait )
63+ - [ Schema 方法实现] ( #方法实现 )
64+ - [ 函数声明和实现 ] ( #函数 )
65+ - [ Query 声明] ( #query )
4066
4167包含以上所有组成内容的样例:
4268
@@ -99,15 +125,14 @@ GödelScript 采用类 C 语言的注释方式。
99125/*
100126* 1. 多行注释
101127* 2. 多行注释
102- * 3. 多行注释
103128*/
104129```
105130
106131#### ` main ` 函数
107132
108133GödelScript 查询脚本可以包含` main ` 函数,该函数无返回值。在不实现` main ` 函数,且没有写 query 声明的情况下,程序不会输出。
109134
110- 更多详细内容请看 [ ` main ` 函数] ( #gödelscript-main-函数 ) 。
135+ 更多详细内容请看 [ main 函数] ( #gödelscript-main-函数 ) 。
111136
112137``` rust
113138fn main () {
@@ -496,9 +521,9 @@ fn a() -> int {
496521}
497522
498523fn b() -> * int {
499- yield 1
500- yield 2
501- yield 3
524+ yield 1
525+ yield 2
526+ yield 3
502527}
503528```
504529
@@ -536,9 +561,9 @@ GödelScript 使用如下方式来声明和实现`schema`的相关方法:
536561impl File {
537562 // 静态方法
538563 fn f1() -> ... {... }
539- // 成员方法,第一个参数必须为 self
540- fn f2(self ) -> ... {... }
541- ...
564+ // 成员方法,第一个参数必须为 self
565+ fn f2(self ) -> ... {... }
566+ ...
542567}
543568```
544569##### 静态方法
@@ -678,7 +703,7 @@ schema File {
678703impl File {
679704 @ data_constraint
680705 fn __all__() -> * File {... }
681- fn getId(self ) -> int {... }
706+ fn getId(self ) -> int {... }
682707 fn staticMethod() -> string {return "File "}
683708}
684709
@@ -947,11 +972,11 @@ database MyDB {
947972
948973```rust
949974query example from
950- coref :: java :: Location loc in coref :: java :: Location (coref :: java :: JavaDB :: load("... "))
975+ coref :: java :: Location loc in coref :: java :: Location (coref :: java :: JavaDB :: load("... "))
951976where
952- ...
977+ ...
953978select
954- ...
979+ ...
955980```
956981
957982- schema 静态方法调用
@@ -971,12 +996,12 @@ Query 用于进行一些简单的查询,编写的 query 一定会被输出,
971996
972997```rust
973998query 名字 from
974- 变量名 in 初始值,
999+ 变量名 in 初始值,
9751000 变量名 in 初始值,
9761001 变量名 in 初始值
9771002where 条件
9781003select 值 as 输出的列名
979- 值 as 输出的列名,
1004+ 值 as 输出的列名,
9801005 值 as 输出的列名,
9811006 值 as 输出的列名
9821007```
@@ -987,7 +1012,7 @@ from 列表中的变量声明无需加上类型标注,编译器会进行自动
9871012
9881013```rust
9891014query hello_world from
990- info in "hello world"
1015+ info in "hello world"
9911016select info as greeting
9921017```
9931018
@@ -1063,14 +1088,14 @@ fn class_method(className: string, methodName: string, methodSignature: string)
10631088G ödelScript 会将未与数据绑定的符号判定为`ungrounded(未赋值/ 未绑定)`。基本判定规则为:
10641089
10651090- 未初始化的/ 未被使用的/ 未与集合绑定的符号
1066- - 未被绑定的`int``string`参数
1091+ - 未被绑定的`int` `string`参数
10671092 - 未被使用的 database 类型的参数
10681093 - 函数体有语句,但是没有任何返回语句
10691094- 在取非运算块中进行绑定的符号
10701095 - 例如 `! (__tmp = 1)`,`__tmp`会被认为是未绑定的
10711096 - 在取非运算块中调用 inline 函数或数据构造函数
10721097
1073- #### 未使用的 database/ 基础类型参数
1098+ #### 1 . 未使用的 database/ 基础类型参数
10741099
10751100函数代码块中,如果有一个语句分支没有使用参数中的`database`或者基础类型参数,则一定会导致`ungrounded`:
10761101
@@ -1091,7 +1116,7 @@ impl XXX {
10911116 if (self . hasAttribute(attributeName)) {
10921117 return self . getValueByAttributeName(attributeName)
10931118 }
1094- if (! self . hasAttribute(attributeName) {
1119+ if (! self . hasAttribute(attributeName)) {
10951120 return "null"
10961121 }
10971122 }
@@ -1104,7 +1129,7 @@ fn xxx() -> xx {
11041129}
11051130```
11061131
1107- #### 函数体有语句的情况下无返回语句
1132+ #### 2 . 函数体有语句的情况下无返回语句
11081133
11091134G ödelScript 允许一个函数体不包含任何语句,即空函数体。但是如果函数体中有其他语句,则 G ödelScript 会要求必须有至少一个返回语句,否则就会出现 ungrounded error。
11101135
@@ -1118,7 +1143,7 @@ fn test() -> int {
11181143}
11191144```
11201145
1121- #### 取非运算块中使用 inline 函数或数据构造函数
1146+ #### 3 . 取非运算块中使用 inline 函数或数据构造函数
11221147
11231148上文提到了可以通过`@ inline`注解来规避 ungrounded error。但是如果在取非运算中使用了含有该注解的函数,则必然会导致 ungrounded error。
11241149
@@ -1142,7 +1167,7 @@ if (!check(for_test())) {
11421167}
11431168```
11441169
1145- #### 对链式调用的取非运算
1170+ #### 4 . 对链式调用的取非运算
11461171
11471172G ödelScript 未对该情况执行`ungrounded`检测,但是该写法会导致在 Souffl é 中报`ungrounded`错误:
11481173
@@ -1226,7 +1251,7 @@ fn main() {
12261251use coref :: java :: *
12271252
12281253fn default_java_db() -> JavaDB {
1229- return JavaDB :: load("coref_java_src. db")
1254+ return JavaDB :: load("coref_java_src. db")
12301255}
12311256
12321257/**
@@ -1243,7 +1268,7 @@ fn class_hierarchy(className : string, superClassName : string) -> bool {
12431268}
12441269
12451270fn main() {
1246- output(class_hierarchy())
1271+ output(class_hierarchy())
12471272}
12481273```
12491274
@@ -1254,7 +1279,7 @@ fn main() {
12541279use coref :: java :: *
12551280
12561281fn default_java_db() -> JavaDB {
1257- return JavaDB :: load("coref_java_src. db")
1282+ return JavaDB :: load("coref_java_src. db")
12581283}
12591284
12601285// Find all methods of the class
@@ -1268,7 +1293,7 @@ fn methods(className : string, methodName : string) -> bool {
12681293}
12691294
12701295fn main() {
1271- output(methods())
1296+ output(methods())
12721297}
12731298```
12741299
@@ -2191,7 +2216,7 @@ fn getByIndex(self) -> Expression {
21912216 return e
21922217 }
21932218 }
2194- }
2219+ }
21952220}
21962221```
21972222
0 commit comments