关于人在不想干正事的时候能干出啥来。。。
第一次记录:2024年12月24日丑时
有不少 Bug,稳定性可能不是很好,但是很爽!(比如优先级问题)
项目结构如下!
MrMath
├─ ...
├─ Cargo.lock
├─ Cargo.toml
└─ src
├─ backend
│ ├─ ast.rs
│ ├─ bigint
│ │ ├─ fraction.rs
│ │ ├─ matrix.rs
│ │ └─ mod.rs
│ ├─ driver.rs
│ ├─ interpreter
│ │ └─ mod.rs
│ ├─ mod.rs
│ └─ parser
│ ├─ mod.rs
│ └─ token.pest
├─ basic
├─ frontend
│ ├─ help.rs
│ ├─ history.rs
│ ├─ mod.rs
│ └─ service.rs
├─ hello.rs
└─ main.rs
其中 token.pest 文件如下:
WHITE_SPACE = _{ " " | "\t" | "\r" }
GRAMMAR = { SOI ~ TRANS_UNIT ~ EOI }
NEWLINE = _{ "\n" }
TRANS_UNIT = { BLOCK }
// BLOCK = { (STMT ~ NEWLINE) + }
BLOCK = { STMT* }
STMT = { VAR_STMT | EXPR_STMT | PRINT_STMT }
VAR_STMT = { VAR ~ WHITE_SPACE* ~ ID ~ WHITE_SPACE* ~ "=" ~ WHITE_SPACE* ~ TYPE ~ WHITE_SPACE* ~ EXPR ~ WHITE_SPACE* ~ ";" }
// EXPR_STMT = { EXPR ~ WHITE_SPACE* ~ ";" }
EXPR_STMT = { EXPR ~ WHITE_SPACE* }
PRINT_STMT = { "print" ~ WHITE_SPACE* ~ EXPR ~ WHITE_SPACE* ~ ";" }
ID = { ASCII_ALPHA ~ ASCII_ALPHA_NUM* }
ASCII_ALPHA_NUM = { ASCII_ALPHA | ASCII_DIGIT }
EXPR = { ATOM_EXPR ~ (INFIX_OPS ~ ATOM_EXPR)* }
PREFIX_OPS = { (WHITE_SPACE* ~ PREFIX_OP)* ~ WHITE_SPACE* }
POSTFIX_OPS = { (WHITE_SPACE* ~ POSTFIX_OP)* }
INFIX_OPS = { WHITE_SPACE* ~ INFIX_OP ~ WHITE_SPACE*}
ATOM_EXPR = { PREFIX_OPS ~ PRIMARY_EXPR ~ POSTFIX_OPS }
PRIMARY_EXPR = { INTEGER | FRACTION | VECTOR | MATRIX | "(" ~ WHITE_SPACE* ~ EXPR ~ WHITE_SPACE* ~ ")" }
EXPR_SHORT = { ATOM_EXPR_SHORT ~ (INFIX_OPS ~ ATOM_EXPR_SHORT)* }
ATOM_EXPR_SHORT = { PREFIX_OPS ~ PRIMARY_EXPR ~ POSTFIX_OPS }
PRIMARY_EXPR_SHORT = { INTEGER | FRACTION }
TYPE = { INT_TYPE | FRAC_TYPE | VECTOR_TYPE | MATRIX_TYPE }
INT_TYPE = { "Int" }
FRAC_TYPE = { "Frac" }
MATRIX_TYPE = { "Mat" | "Matrix" }
VECTOR_TYPE = { "Vec" | "Vector" }
PREFIX_OP = { "abs" | "+" | "-" }
POSTFIX_OP = { "!" | "^T" }
INFIX_OP = { MOD_OP | MUL_OP | ADD_OP }
MOD_OP = { "%" | "**" }
MUL_OP = { "*" | "//" }
ADD_OP = { "+" | "-" }
INTEGER = { ASCII_DIGIT+ }
// FRACTION = { "Frac" ~ "[" ~ WHITE_SPACE* ~ EXPR_SHORT ~ WHITE_SPACE* ~ "," ~ WHITE_SPACE* ~ EXPR_SHORT ~ WHITE_SPACE* ~ "]" }
FRACTION = { "Frac" ~ "[" ~ WHITE_SPACE* ~ INTEGER ~ WHITE_SPACE* ~ "," ~ WHITE_SPACE* ~ INTEGER ~ WHITE_SPACE* ~ "]" }
MATRIX = { "Mat" ~ "[" ~ WHITE_SPACE* ~ MATRIX_ROWS ~ WHITE_SPACE* ~ "]" }
MATRIX_ROWS = { VECTOR_ROW ~ (WHITE_SPACE* ~ "," ~ WHITE_SPACE* ~ VECTOR_ROW)* }
VECTOR = { "Vec" ~ VECTOR_ROW }
// VECTOR_ROW = { "[" ~ WHITE_SPACE* ~ EXPR_SHORT ~ (WHITE_SPACE* ~ "," ~ WHITE_SPACE* ~ EXPR_SHORT)* ~ WHITE_SPACE* ~ "]" }
VECTOR_ROW = { "[" ~ WHITE_SPACE* ~ INTEGER ~ (WHITE_SPACE* ~ "," ~ WHITE_SPACE* ~ INTEGER)* ~ WHITE_SPACE* ~ "]" }
VAR = { "var" }
设计还很不完善,但是已经可以运行了,不枉三天功夫。
乐,明天早上还要交 代数 作业,,,
第二次记录:2024年12月28日子时
A Math Calculator implementation in Rust.
MrMath = My Rust Math Calculator
MrMath
├─ Cargo.lock
├─ Cargo.toml
└─ src
├─ backend
│ ├─ bigint
│ │ ├─ fraction.rs
│ │ ├─ matrix.rs
│ │ └─ mod.rs
│ ├─ driver.rs
│ ├─ interpreter
│ │ ├─ interpreter.rs
│ │ └─ mod.rs
│ ├─ mod.rs
│ ├─ parser
│ │ ├─ mod.rs
│ │ └─ token.pest
│ └─ structure
│ ├─ ast.rs
│ └─ mod.rs
├─ basic
├─ files
│ ├─ manual
│ │ ├─ fraction.txt
│ │ ├─ integer.txt
│ │ ├─ matrix.txt
│ │ ├─ variable.txt
│ │ └─ vector.txt
│ └─ tables
│ └─ keywords.txt
├─ frontend
│ ├─ check.rs
│ ├─ help.rs
│ ├─ history.rs
│ ├─ mod.rs
│ └─ service.rs
├─ hello.rs
└─ main.rs
添加了不少功能,实现了变量和常量,定义更加灵活,支持整数、分数、向量和矩阵的运算,分数、向量和矩阵的定义中可以包含部分复杂的表达式。
该去回头学理论泡论文写开题报告力。。。
估计后面会有一长段时间不碰这个了。