手搓的简易基于 rust 的自己设计数学语言的解释器,很爽!

关于人在不想干正事的时候能干出啥来。。。

第一次记录:2024年12月24日丑时

1734977873447

有不少 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

添加了不少功能,实现了变量常量,定义更加灵活,支持整数、分数、向量和矩阵的运算,分数、向量和矩阵的定义中可以包含部分复杂的表达式。

1735320570968

该去回头学理论泡论文写开题报告力。。。

估计后面会有一长段时间不碰这个了。

上一篇  下一篇