## `Fig Programming Language` DESIGN DOC --- ### 关键词解释 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}` ```