5.7 KiB
5.7 KiB
Fig Programming Language DESIGN DOC
关键词解释 Token
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即:文件终止符EOFComments注释Token,包括单行和多行Identifier标识符,用户定义的‘名字’And->&&或and逻辑与Or->||或or逻辑或Not->!或!逻辑非Import->import导入关键字,用于导入包。 e.gimport std.io
Function->function定义函数,匿名也可此处的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定义变量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定义全过程常量: 从词法分析到求值器内的生命周期都为常量,仅能在生命周期内赋值一次,使用时也只有一个唯一对象 必须在源码中指定值const Pi = 3.1415926; // recommended const name; // ❌ 错误定义后的常量,其值及类型均不可改变,故可省略类型标识。这是推荐的写法 同时,也可作为结构体成员的修饰
struct MathConstants { const Pi = 3.1415926; };
Final->final定义结构体运行时常量:从运行期开始的常量,仅能在运行时被赋值一次, 仅修饰结构体成员 不存在 final 类型的外部常量 定义后的常量,其值及类型均不可改变,故可省略类型标识。这是推荐的写法struct Person { final name: String final age: Int final sex: String = "gender" // ❌ 请使用 const 代替 }
-
While->whilewhile循环,满足一个布尔类型条件循环执行语句while (ans != 27.19236) { ans = Int.parse(std.io.readline()); }
For->forfor循环,拥有初始语句、条件、增长语句for (init; condition; increment) { statements...; }
-
Struct->struct结构体,面对对象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}`