forked from PuqiAR/Fig-TreeWalker
249 lines
5.7 KiB
Markdown
249 lines
5.7 KiB
Markdown
## `Fig Programming Language` <font face="Consolas"> DESIGN DOC </font>
|
||
|
||
---
|
||
### 关键词解释 Token
|
||
|
||
``` cpp
|
||
enum class TokenType : int8_t
|
||
{
|
||
Illegal = -1,
|
||
EndOfFile = 0,
|
||
|
||
Comments,
|
||
|
||
Identifier,
|
||
|
||
/* Keywords */
|
||
And, // and
|
||
Or, // or
|
||
Not, // not
|
||
Import, // import
|
||
Function, // fun
|
||
Variable, // var
|
||
Const, // const
|
||
Final, // final
|
||
While, // while
|
||
For, // for
|
||
Struct, // struct
|
||
Interface, // interface
|
||
Implement, // implement
|
||
Public, // public
|
||
|
||
// TypeNull, // Null
|
||
// TypeInt, // Int
|
||
// TypeString, // String
|
||
// TypeBool, // Bool
|
||
// TypeDouble, // Double
|
||
|
||
/* Literal Types (not keyword)*/
|
||
LiteralNumber, // number (int,float...)
|
||
LiteralString, // FString
|
||
LiteralBool, // bool (true/false)
|
||
LiteralNull, // null (Null的唯一实例)
|
||
|
||
/* Punct */
|
||
Plus, // +
|
||
Minus, // -
|
||
Asterisk, // *
|
||
Slash, // /
|
||
Percent, // %
|
||
Caret, // ^
|
||
Ampersand, // &
|
||
Pipe, // |
|
||
Tilde, // ~
|
||
ShiftLeft, // <<
|
||
ShiftRight, // >>
|
||
// Exclamation, // !
|
||
Question, // ?
|
||
Assign, // =
|
||
Less, // <
|
||
Greater, // >
|
||
Dot, // .
|
||
Comma, // ,
|
||
Colon, // :
|
||
Semicolon, // ;
|
||
SingleQuote, // '
|
||
DoubleQuote, // "
|
||
// Backtick, // `
|
||
// At, // @
|
||
// Hash, // #
|
||
// Dollar, // $
|
||
// Backslash, // '\'
|
||
// Underscore, // _
|
||
LeftParen, // (
|
||
RightParen, // )
|
||
LeftBracket, // [
|
||
RightBracket, // ]
|
||
LeftBrace, // {
|
||
RightBrace, // }
|
||
// LeftArrow, // <-
|
||
RightArrow, // ->
|
||
// DoubleArrow, // =>
|
||
Equal, // ==
|
||
NotEqual, // !=
|
||
LessEqual, // <=
|
||
GreaterEqual, // >=
|
||
PlusEqual, // +=
|
||
MinusEqual, // -=
|
||
AsteriskEqual, // *=
|
||
SlashEqual, // /=
|
||
PercentEqual, // %=
|
||
CaretEqual, // ^=
|
||
DoublePlus, // ++
|
||
DoubleMinus, // --
|
||
DoubleAmpersand, // &&
|
||
DoublePipe, // ||
|
||
Walrus, // :=
|
||
Power, // **
|
||
};
|
||
```
|
||
|
||
* `Illegal`
|
||
非法Token:无法解析或语法错误
|
||
|
||
* `EndOfFile`
|
||
即:
|
||
```cpp
|
||
EOF
|
||
```
|
||
文件终止符
|
||
|
||
* `Comments`
|
||
注释Token,包括单行和多行
|
||
|
||
* `Identifier`
|
||
标识符,用户定义的‘名字’
|
||
|
||
* `And` -> `&&` 或 `and`
|
||
逻辑与
|
||
|
||
* `Or` -> `||` 或 `or`
|
||
逻辑或
|
||
|
||
* `Not` -> `!` 或 `!`
|
||
逻辑非
|
||
|
||
* `Import` -> `import`
|
||
导入关键字,用于导入包。 e.g
|
||
``` python
|
||
import std.io
|
||
```
|
||
|
||
* `Function` -> `function`
|
||
定义函数,匿名也可
|
||
``` javascript
|
||
function greeting() -> Null public
|
||
{
|
||
std.io.println("Hello, world!");
|
||
}
|
||
|
||
function intAdder() -> Function public
|
||
{
|
||
return function(n1: Int, n2: Int) => n1 + n2;
|
||
}
|
||
```
|
||
此处的 `public` 为公开标识
|
||
不进行显示声明 `public` 默认为私有,即对象仅能在当前作用域访问
|
||
|
||
* `Variable` -> `var`
|
||
定义变量
|
||
``` dart
|
||
var foobar;
|
||
var defaultVal = 1145;
|
||
var numberSpecific: Int;
|
||
var numberDefault: Int = 91;
|
||
|
||
foobar = "hello, world!";
|
||
foobar = 13;
|
||
|
||
defaultVal = "it can be any value";
|
||
|
||
numberSpecific = 78;
|
||
numberDefault = 0;
|
||
```
|
||
|
||
* `Const` -> `const`
|
||
定义`全过程`常量: 从词法分析到求值器内的生命周期都为常量,仅能**在生命周期内**赋值一次,使用时也只有一个唯一对象
|
||
|
||
必须在源码中指定值
|
||
|
||
``` dart
|
||
const Pi = 3.1415926; // recommended
|
||
|
||
const name; // ❌ 错误
|
||
```
|
||
|
||
定义后的常量,其值及类型均不可改变,故可省略类型标识。这是推荐的写法
|
||
同时,也可作为结构体成员的修饰
|
||
``` cpp
|
||
struct MathConstants
|
||
{
|
||
const Pi = 3.1415926;
|
||
};
|
||
```
|
||
|
||
* `Final` -> `final`
|
||
定义`结构体运行时`常量:从运行期开始的常量,仅能**在运行时**被赋值一次, **仅修饰结构体成员**
|
||
不存在 **final** 类型的外部常量
|
||
|
||
定义后的常量,其值及类型均不可改变,故可省略类型标识。这是推荐的写法
|
||
``` cpp
|
||
struct Person
|
||
{
|
||
final name: String
|
||
final age: Int
|
||
|
||
final sex: String = "gender" // ❌ 请使用 const 代替
|
||
}
|
||
```
|
||
|
||
* `While` -> `while`
|
||
while循环,满足一个布尔类型条件循环执行语句
|
||
|
||
``` cpp
|
||
while (ans != 27.19236)
|
||
{
|
||
ans = Int.parse(std.io.readline());
|
||
}
|
||
```
|
||
|
||
* `For` -> `for`
|
||
for循环,拥有初始语句、条件、增长语句
|
||
``` cpp
|
||
for (init; condition; increment)
|
||
{
|
||
statements...;
|
||
}
|
||
```
|
||
|
||
* `Struct` -> `struct`
|
||
结构体,面对对象
|
||
|
||
``` cpp
|
||
struct Person
|
||
{
|
||
public final name: String; // public, final
|
||
public age: Int; // public
|
||
sex: String; // private normally;
|
||
|
||
const ADULT_AGE = 18; // private, const
|
||
|
||
fun printInfo()
|
||
{
|
||
std.io.println("name: {}, age: {}, sex: {}", name, age, sex);
|
||
}
|
||
};
|
||
|
||
var person = Person {"Fig", 1, "IDK"};
|
||
// or
|
||
var person = Person {name: "Fig", age: 1, sex: "IDK"}; // can be unordered
|
||
|
||
var name = "Fig";
|
||
var age = 1;
|
||
var sex = "IDK";
|
||
|
||
var person = Person {name, age, sex};
|
||
// = `var person = Person {name: name, age: age, sex: sex}`
|
||
```
|
||
|