📖 第一章:编译流程与主要用途
1.1 编译流程(7步管线)
Paper6 采用翻译型编译架构,源码经以下7步处理生成原生 Windows EXE:
1.2 主要用途
Paper6 是一门面向 Windows 桌面开发的Transcompiler(翻译编译器),专门针对 Win32 GUI 开发设计:
- · 声明式 GUI 描述:用类似 HTML 的语法快速构建窗口界面
- · 零运行时依赖:生成的 EXE 不包含任何解释器,直接原生执行
- · 跨平台工具链:编译器内置 g++,无需额外安装编译环境
- · 标准库丰富:覆盖 Win32 API、文件操作、数学、网络等常用功能
📖 第二章:pslib 与 paper
2.1 pslib 标准库系统
pslib 是 Paper6 的标准库系统,采用纯文本文件组织,由 PslibBootloader 在编译期加载:
可用 .pslib 模块:
normal.pslib
win32.pslib
io.pslib
math.pslib / math2.pslib
string.pslib / text.pslib
array.pslib / list.pslib / dict.pslib
set.pslib / queue.pslib / stack.pslib
container.pslib / tree.pslib
file.pslib
color.pslib
time.pslib
json.pslib
regex.pslib
crypto.pslib
http.pslib
system.pslib
numeric.pslib
log.pslib
2.2 paper 块声明式语法
paper 块是 Paper6 的核心特色,用于声明式描述 Win32 窗口和控件:
paper MyWindow {
title = "我的窗口";
width = 400;
height = 300;
icon = "icon/Paper6.ico";
button btnOk {
text = "确定";
x = 10; y = 10; w = 80; h = 30;
onClick() {
alert("确定了!");
}
}
}
编译器自动将 paper 块翻译成等效的 C++ Win32 API 调用代码。
📖 第三章:变量与循环
3.1 变量声明
var x = 10
let y = "hello"
const z = 3.14
3.2 数据类型
value x = 100
int n = 42
double pi = 3.14159
string s = "Hello"
bool b = true
3.3 赋值与算术
x = x + 1
x += 1
result = a + b
3.4 for 循环
for (int i in [0..10]) {
alert(i);
}
for (item in myArray) {
process(item);
}
3.5 while 循环
while (running) {
update();
}
3.6 .all 批量操作
nums.all = 1
nums.all = this * 2
labels.all.text = "Hi"
vec.all.show()
3.7 数组操作
arr = {1, 2, 3}
first = arr[0]
squares = [x*x for x in [1..10]]
📖 第五章:特性和语法糖
5.1 .all 批量操作
.all 是循环构造,将循环起点标记在 .all 处,后续表达式逐元素执行:
nums.all = 1
nums.all = this * 2
labels.all.text = "Hi"
.all 规则:
· .all 不能做右值(右侧出现 .all 直接报错)
· this/serial/index 只能在 .all 语句内使用
· 对 const 容器执行 .all 赋值报错
5.2 列表推导式
[x*x for x in [1..10]]
[x for x in [0..100] where x % 2 == 0]
[[x,y] for x in [1..3], y in [1..3]]
返回列表推导式是立即执行的 lambda,返回一个新数组(临时对象)。
5.3 when 编译期分支
when (x) {
is int -> 1;
is string -> 2;
else -> 0;
}
根据 x 的 typeName 在不同分支中选择表达式,最终返回一个 Value。
5.4 therebe / have 编译期查询
therebe(class Student)
therebe(function foo)
have(Student, .name)
这三个表达式在编译时求值,结果直接替换为 true/false。
5.5 三元表达式
cond ? a : b
x > 0 ? "正数" : "负数"
5.6 链式访问
data.items[0].name
window.children[0].text.length()
📖 第四章:表达式
Paper6 表达式按优先级从低到高排列如下(同一行优先级相同):
4.1 赋值表达式
x = 10
nums.all = 1
labels.all.text = "Hi"
vec.all = this + 1
vec.all.show()
4.2 逻辑运算
a && b
a || b
!a
4.3 比较运算
a == b
a != b
a < b
a > b
a <= b
a >= b
4.4 算术运算
a + b
a - b
a * b
a / b
a % b
4.5 范围运算符
a .. b
[1..5]
[1..10, 2]
4.6 一元运算
-a
!a
4.7 成员访问与索引
obj.name
arr[0]
obj.method()
4.8 函数调用
alert("hello")
len(s)
obj.method(args)
ClassName{field=value}
4.9 字面量表达式
100
3.14
"hello"
#FF0000
true / false
null
4.10 数组字面量
{1, 2, 3}
{"a", "b", "c"}
{key: "value"}
📖 第六章:其他
6.1 函数定义
function greet(string name) value {
return "Hello, " + name;
}
function add(int a, int b) int {
return a + b;
}
6.2 脚本块
脚本块定义函数和事件处理器的作用域:
main.script {
function onShow() {
alert("窗口已显示");
}
function onClick() {
alert("按钮被点击");
}
}
6.3 import / using 机制
import "pslib/win32.pslib";
using math = "pslib/math.pslib";
6.4 defer / expect
defer {
cleanup();
}
expect (x != null, "x 不能为空");
6.5 错误处理
try {
riskyOperation();
} catch (e) {
alert("错误: " + e);
}
throw "出错了!";
6.6 类型判断 is()
is(x, int)
is(x, Student)
is(x, class)
📖 第七章:类与 able 接口
7.1 类定义
class Student {
string name;
int age;
Student(string n, int a) {
name = n;
age = a;
}
function getInfo() string {
return name + "," + age;
}
}
7.2 able 接口
able Printable {
function print() void;
}
class Student able Printable {
string name;
Student(string n) { name = n; }
function print() void {
alert(name);
}
}
7.3 对象构造
var s = Student{name: "张三", age: 18};
var t = new Student("李四", 20);
📖 第八章:Paper 块(GUI 声明式语法)
Paper6 的核心特色:用声明式语法描述 Win32 窗口与控件,编译器自动翻译成 C++ Win32 API 调用。
8.1 基本窗口结构
paper MyWindow {
title = "我的窗口";
width = 400;
height = 300;
icon = "icon/Paper6.ico";
button btnOk {
text = "确定";
x = 10; y = 10; w = 80; h = 30;
onClick() {
alert("确定了!");
}
}
text lblMsg {
text = "Hello Paper6";
x = 100; y = 10; w = 200; h = 30;
}
}
8.2 内置控件类型
支持 button、text、entry(单行输入)、textarea(多行)、checkbox、radio、combobox、listbox、slider、progress、panel、group、tab、canvas、picture、menu、timer、window。
8.3 控件属性
text = "显示文本"
x = 10
y = 20
w = 100
h = 30
color = #FF0000
background = #FFFFFF
font = "LXGWenKaiMono, 12"
📖 第九章:纸片化开发
9.1 什么是纸片化?
Paper6 的"纸片化"理念:像剪纸一样,把 UI 布局从代码中剥离出来,用声明式语法描述界面,逻辑与表现分离。
paper MainWindow {
title = "我的应用";
width = 600;
height = 400;
button btnClose {
text = "关闭";
x = 500; y = 350; w = 80; h = 30;
onClick() {
postQuitMessage();
}
}
}
9.2 逻辑与表现分离
paper 块只负责声明界面结构和事件绑定,具体逻辑写在 `script` 块或函数中:
paper Calculator {
entry display {
x = 10; y = 10; w = 280; h = 40;
text = "0";
}
button btn1 {
text = "1";
x = 10; y = 60; w = 70; h = 40;
onClick() { appendDigit("1"); }
}
}
Calculator.script {
value current = "0";
function appendDigit(string d) {
if (current == "0") current = d;
else current = current + d;
display.text = current;
}
}
📖 第十章:调试与部署
10.1 调试模式
paper6c.exe hello.paper --debug --keep-cpp
--debug 生成调试辅助代码(断点、日志),--keep-cpp 保留生成的中间 C++ 文件便于排查问题。
10.2 生成中间文件位置
编译时生成的 C++ 中间文件位于源码目录下的 code_generation/ 子目录中,包含 main.cpp 和 import.hpp。
10.3 部署
Paper6 编译器自带便携工具链,生成的 EXE 仅依赖 Win32 系统库,无需额外安装运行环境:
- · 直接分发 .exe 即可运行
- · 如需自定义图标,将 .ico 文件放入同目录并引用
- · 如需使用标准库,确保 .paper 文件与资源文件路径正确
10.4 性能优化建议
· 频繁使用的数值计算优先使用 int/double 而非 value
· 大数组操作考虑使用 container 而非 array
· 编译时添加 -Og 优化级别(已默认开启)
📖 第十一章:进阶特性
11.1 CPP 块——嵌入原生 C++
当 Paper6 语法无法满足需求时,可使用 cpp 块直接嵌入 C++ 代码:
cpp {
std::cout << "Hello from C++!" << std::endl;
MessageBoxW(NULL, "原生弹窗", "CPP块", MB_OK);
}
CSS 规则:
- · cpp 块内代码原样输出到生成的 C++ 文件中
- · 可以访问 Paper6 变量(通过 Value 类型桥接)
- · 适合调用特殊 Win32 API 或第三方库
11.2 泛型支持
typename T;
function identity(T x) T {
return x;
}
使用 typename T 声明泛型参数,编译器在实例化时生成对应特化版本。
11.3 宏(Macro)
macro LOOP_N(n) {
for (int i = 0; i < n; i++) {
yield;
}
}
宏在预处理阶段展开,适合生成重复代码模式。
❓ 第十二章:常见问题
Q: 编译时提示 "file not found"?
确保 .paper 文件路径正确,或使用相对于 paper6c.exe 的路径。
Q: 中文显示乱码?
Paper6 自动处理 UTF-8 → GBK 转换。检查 .paper 文件是否保存为 UTF-8 编码。
Q: 如何嵌入图标?
将 .ico 文件放入项目目录,在 paper 块中指定 icon = "icon/Paper6.ico";
Q: 标准库函数在哪里?
pslib/ 目录下,每个 .pslib 文件对应一个功能模块。
Q: value 和 int 有什么区别?
value 是动态类型,运行时根据 typeName 决定含义;int 在编译时确定为整数类型。相同计算结果,int 执行效率更高,value 灵活性更强。
Q: .all 批量操作失败?
确保操作对象是容器类型(array/container),且右侧表达式能作用于单个元素。右侧出现 .all 会报错(.all 不能做右值)。this/serial/index 只能在 .all 语句内使用。
Q: 为什么 vec.all = [x*x for x in [1..10]] 报错?
右侧列表推导式返回数组,而 .all 要求右侧表达式结果与元素类型匹配。如需整体赋值,用 vec = [x*x for x in [1..10]](不带 .all)。
📋 标准类型
Paper6 内建以下类型(来自 TypeSet.hpp):
value
int
double
string
bool
array
container
map
button, text, entry, textarea
checkbox, radio
combobox, listbox
slider, progress, panel, group
tab, canvas, picture, menu
timer, window
color, font, position, size, rect
cursor, icon
⚙️ 编译命令
paper6c.exe hello.paper
paper6c.exe hello.paper --normal
paper6c.exe hello.paper --win32 --io --math
paper6c.exe hello.paper --debug --keep-cpp
paper6c.exe --help
提示:paper6c.exe 会自动从自身所在目录向外搜索 g++ 编译器,支持便携部署,无需安装额外工具链。
📁 项目结构
Paper-6/
├── include/
│ ├── core/
│ │ ├── common.hpp
│ │ ├── token.{hpp,cpp}
│ │ └── value.{hpp,cpp}
│ ├── lexer/
│ │ └── lexer.{hpp,cpp}
│ ├── parser/
│ │ └── parser.{hpp,cpp}
│ ├── ast/
│ │ └── ast.{hpp,cpp}
│ └── codegen/
│ ├── codegen_core.{hpp,cpp}
│ └── codegen_build.{hpp,cpp}
├── parameter/
│ └── TypeSet.hpp
├── pslib/
│ ├── PslibBootloader.{hpp,cpp}
│ ├── normal.pslib
│ ├── win32.pslib
│ ├── io.pslib
│ ├── math.pslib / math2.pslib
│ ├── string.pslib / text.pslib
│ ├── array.pslib / list.pslib / dict.pslib
│ │ / set.pslib / queue.pslib / stack.pslib
│ ├── container.pslib / tree.pslib
│ ├── file.pslib
│ ├── color.pslib
│ ├── time.pslib
│ ├── json.pslib
│ ├── regex.pslib
│ ├── crypto.pslib
│ ├── http.pslib
│ ├── system.pslib
│ ├── numeric.pslib
│ └── log.pslib
├── src/
│ └── main.cpp
├── font/
│ └── LXGWWenKaiMono-Medium.ttf
├── ico/
│ └── Paper6.ico
├── tools zips/
│ ├── tools.7z.001 ~ tools.7z.006
├── paper6c.exe
├── resource.o
├── resource.rc
├── index.html
└── Paper6 语法大清单.txt
📎 附录:源码下载
源码文件清单
点击上方「下载全部项目文件」按钮可一次性打包下载所有源码与资源。以下列表供单独下载单个文件使用。
完整文件列表(按目录分组)
include/core/ — common.hpp, token.hpp/cpp, value.hpp/cpp
include/lexer/ — lexer.hpp/cpp
include/parser/ — parser.hpp/cpp
include/ast/ — ast.hpp/cpp
include/codegen/ — codegen_core.hpp/cpp, codegen_build.hpp/cpp
parameter/ — TypeSet.hpp
pslib/ — PslibBootloader.hpp/cpp, 共 24 个 .pslib 模块
src/ — main.cpp
tools zips/ — tools.7z.001~006(解压后含 g++ 工具链)
include/ 各模块独立下载
src/main.cpp
编译器入口文件,实现 7 步编译管线:
parameter/TypeSet.hpp
pslib/ 标准库