1.常用数据类型
打开PyCharm开发工具,新建一个名为demo01.py文件,python的常用数据类型(也叫字面量)有整型(如:123)、浮点型(如:1.23)、字符型(如:"123")等等,这里先认识一下这三种吧,在编辑器中编写代码,如下图所示
2.代码注释
2025年06月13日
1.常用数据类型
打开PyCharm开发工具,新建一个名为demo01.py文件,python的常用数据类型(也叫字面量)有整型(如:123)、浮点型(如:1.23)、字符型(如:"123")等等,这里先认识一下这三种吧,在编辑器中编写代码,如下图所示
2.代码注释
2025年06月13日
package cangjie_test
import std.ast.*
import std.math.numeric.*
import std.math.*
import std.console.*
// 元编程
// 一个相当好玩的特性
// 二元操作包装枚举
enum BinaryWrap {
| Fail
| Lit(Decimal)
| Mul(BinaryWrap, BinaryWrap) // *
| Div(BinaryWrap, BinaryWrap) // /
| Add(BinaryWrap, BinaryWrap) // +
| Sub(BinaryWrap, BinaryWrap) // -
| Parent(BinaryWrap) // ()
}
main() {
// 输出提示语句
output("请输入四则运算表达式:")
// 从命令行输入
while (let Some(expr) <- Console.stdIn.readln()) { // 循环读取
// 动态解析一条表达式
let tokens = cangjieLex(expr)
// 将表达式符合集解析成仓颉表达式
let _expr = parseExpr(tokens)
// 输出表达式语法树
// _expr.dump()
// 解析成二元操作树
let binaryTree = parseBinary(_expr)
// 计算结果
let val = compute(binaryTree)
output("${expr} = ${val}\n")
// 输出提示语句
output("请输入四则运算表达式:")
}
}
// 包装一个控制台输出函数
func output(msg: String) {
Console.stdOut.write(msg) // 写入消息
Console.stdOut.flush() // 刷入缓存
}
// 包装成二元操作树
func parseBinary(expr: Expr): BinaryWrap {
match (expr) {
case v: BinaryExpr => match (v.op.kind) {
case TokenKind.ADD => BinaryWrap.Add(parseBinary(v.leftExpr), parseBinary(v.rightExpr))
case TokenKind.SUB => BinaryWrap.Sub(parseBinary(v.leftExpr), parseBinary(v.rightExpr))
case TokenKind.MUL => BinaryWrap.Parent(BinaryWrap.Mul(parseBinary(v.leftExpr), parseBinary(v.rightExpr)))
case TokenKind.DIV => BinaryWrap.Parent(BinaryWrap.Div(parseBinary(v.leftExpr), parseBinary(v.rightExpr)))
case _ =>
output("不支持的操作符'${v.op.value}'")
BinaryWrap.Fail
}
case v: ParenExpr => BinaryWrap.Parent(parseBinary(v.parenthesizedExpr))
case v: LitConstExpr => match (v.literal.kind) {
case TokenKind.INTEGER_LITERAL | TokenKind.FLOAT_LITERAL => BinaryWrap.Lit(Decimal(v.literal.value))
case _ =>
output("不支持的数值类型'${v.literal.value}'")
BinaryWrap.Fail
}
case _ =>
output("不支持的语法'${expr.toTokens()}'")
BinaryWrap.Fail
}
}
// 计算结果
func compute(root: BinaryWrap): Decimal {
match (root) {
case BinaryWrap.Mul(l, r) => compute(l) * compute(r)
case BinaryWrap.Div(l, r) => compute(l) / compute(r)
case BinaryWrap.Add(l, r) => compute(l) + compute(r)
case BinaryWrap.Sub(l, r) => compute(l) - compute(r)
case BinaryWrap.Parent(l) => compute(l)
case BinaryWrap.Lit(l) => l
case BinaryWrap.Fail =>
output("无法计算")
Decimal(0.0)
}
}