# 基础语法

## 注释

Fig 支持两种注释格式：

单行注释：
```go
// 这是一个单行注释
var x = 10; // 注释可以在语句后面
```

多行注释：
```go
/* 这是一个
   多行注释 */
/* 注释内可以有 // 嵌套的单行注释 */
```

注释不能嵌套多个多行注释：`/* /* 嵌套 */ */` 会导致错误。

## 变量声明

### 可变变量
```go
var name = "Fig";
var count = 0;
count = count + 1;  // 可以重新赋值
```

### 常量
```go
const PI = 3.14159;
const MAX_SIZE = 100;
// PI = 3.14;  // 错误：常量不能重新赋值
```

常量必须在声明时初始化。

### 类型注解（可选）
```go
var name: String = "Fig";
var age: Int = 14;
const VERSION: Double = 0.4;
```

类型注解提供额外的类型信息，但解释器会在运行时进行类型检查。

## 标识符命名

### 规则
- 可以包含字母、数字和下划线
- 不能以数字开头
- 区分大小写
- 支持 Unicode 字符

### 有效示例
```go
var count = 0;
var user_name = "Alice";
var 计数器 = 0;      // 中文标识符
var π = 3.14159;    // Unicode 符号
var _private = true; // 以下划线开头
```

### 无效示例
```
var 123abc = 0;     // 不能以数字开头
var my-var = 0;     // 不能包含连字符
```

## 基本字面量

### 数字
```go
// 整数
var a = 42;        // 十进制
var b = -100;      // 负数
var c = 0;         // 零

// 浮点数
var d = 3.14;
var e = 1.0;
var f = -0.5;
var g = 1.23e-10;  // 科学计数法
```

### 字符串
```go
var s1 = "Hello";
var s2 = "World";
var s3 = "包含\"引号\"的字符串";  // 转义引号
var s4 = "第一行\n第二行";        // 转义换行符
```

多行字符串直接跨行书写：
```rust
var message = "这是一个
多行字符串
可以包含多行内容";
```

### 布尔值
```go
var yes = true;
var no = false;
```

### 空值
```dart
var nothing = null;
```

## 分号使用

所有语句都必须以分号结束：

```go
var x = 10;         // 正确
var y = 20          // 错误：缺少分号

func add(a, b) {
    return a + b;   // return 语句需要分号
}                   // 函数体右花括号后不需要分号
```

表达式作为独立语句时也需要分号：
```go
1 + 2 * 3;          // 表达式语句需要分号
io.println("test"); // 函数调用语句需要分号
```

## 表达式与语句

### 表达式
表达式会产生一个值（包括 `null`）：
```go
1 + 2               // 值为 3
x * y               // 值为乘积
funcCall(arg)       // 值为函数返回值
```

### 语句
语句执行操作但不产生值：
```go
var x = 10;         // 声明语句
if condition {}     // 条件语句
return value;       // 返回语句
```

表达式可以作为语句使用（表达式语句）：
```go
1 + 2;              // 计算但丢弃结果
io.println("hi");   // 函数调用作为语句
```

## 关键字

Fig 语言的关键字包括：

| 类别     | 关键字                                                      |
| -------- | ----------------------------------------------------------- |
| 声明     | `func`, `var`, `const`, `struct`, `interface`, `import`     |
| 控制流   | `if`, `else`, `while`, `for`, `return`, `break`, `continue` |
| 错误处理 | `try`, `catch`, `throw`, `finally`                          |
| 逻辑运算 | `and`, `or`, `not`                                        |
| 类型相关 | `is`, `as`, `impl`, `new`, `public`                               |

这些关键字不能用作标识符名称。

## 操作符

### 算术运算符
`+`, `-`, `*`, `/`, `%`, `**`（幂运算）

### 比较运算符
`==`, `!=`, `<`, `>`, `<=`, `>=`

### 逻辑运算符
`and`, `or`, `not`, `&&`, `||`, `!`

### 位运算符
`&`, `|`, `^`, `~`, `<<`, `>>`

### 赋值运算符
`=`, `:=`, `+=`, `-=`, `*=`, `/=`, `%=`, `^=`

### 其他运算符
`.`（成员访问）, `?`（三元运算）, `...`（可变参数）, `->`（箭头）, `=>`（双箭头）

## 空白字符

Fig 对空白字符没有特殊要求：
- 空格和制表符可以互换使用
- 缩进不影响程序语义
- 操作符周围的空格是可选的（但建议添加以提高可读性）

## 代码示例

```go
// 完整的程序示例
import std.io;

func calculate(a: Int, b: Int) -> Int {
    var result = a * b;
    return result + 10;
}

const x = 5;
const y = 3;
var answer = calculate(x, y);
io.println("结果是：" + answer.toString());
```