Files
Fig/docs/FigDesignDocument.md
2025-12-19 20:38:40 +08:00

5.7 KiB
Raw Blame History

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 即:
    EOF
    
    文件终止符  
  • Comments 注释Token包括单行和多行  
  • Identifier 标识符,用户定义的‘名字’  
  • And -> &&and 逻辑与  
  • Or -> ||or 逻辑或  
  • Not -> !! 逻辑非  
  • Import -> import 导入关键字,用于导入包。 e.g
    import 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 -> while while循环满足一个布尔类型条件循环执行语句

    while (ans != 27.19236)
    {
      ans = Int.parse(std.io.readline());
    }
    

 

  • For -> for for循环拥有初始语句、条件、增长语句
    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}`