上传代码

This commit is contained in:
chentianrui
2025-09-08 17:58:02 +08:00
parent be848c3e78
commit f5f26c5cf8
76 changed files with 839039 additions and 2695 deletions
+47 -15
View File
@@ -11,12 +11,11 @@ import re
from xml.dom import minidom
# 配置logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[logging.FileHandler("bcl_calculator.log"), logging.StreamHandler()],
)
# 配置logging(不在导入时绑定固定文件,具体文件由调用方配置)
_root_logger = logging.getLogger()
if not _root_logger.handlers:
# 避免 "No handler could be found" 警告
_root_logger.addHandler(logging.NullHandler())
class BCLVariantType(Enum):
@@ -1609,30 +1608,63 @@ class BCLCalculator:
continue
var_name = var_node.get("text")
variables[var_name] = self._get_variable_value(var_name, context)
var_value_obj = self._get_variable_value(var_name, context)
variables[var_name] = var_value_obj
# 构建表达式字符串
expr_str = expr_node.get("text")
expr_str = expr_node.get("text", "<unknown>")
if not expr_str:
expr_str = "<empty>"
# 构造符号表,转换为 float
symbols = {}
for var_name, var_value in variables.items():
symbols[var_name] = float("0" if not var_value.get_value() else var_value.get_value())
var_values_log = {}
for var_name, var_value_obj in variables.items():
raw_value = var_value_obj.get_value()
try:
# 安全转换为 float
float_value = float("0" if not raw_value else raw_value)
symbols[var_name] = float_value
var_values_log[var_name] = float_value
except (ValueError, TypeError) as e:
var_values_log[var_name] = f"无法转换为float: {raw_value} (类型: {type(raw_value).__name__})"
logging.debug(f"开始计算表达式: '{expr_str}'")
logging.debug(f"变量绑定值: {var_values_log}")
calculator = ExpressionCalculator()
parse_success = calculator.parse_expression(expr_str)
if not parse_success:
logging.error(f"表达式解析失败: {calculator.get_last_error()}")
raise ValueError(f"表达式解析失败: {calculator.get_last_error()}")
error_msg = calculator.get_last_error()
logging.error(
f"[表达式解析失败] " f"表达式='{expr_str}', " f"变量值={var_values_log}, " f"错误详情='{error_msg}'"
)
raise ValueError(f"表达式解析失败: {error_msg}")
# 执行四则运算并返回结果
result, value = calculator.evaluate(symbols)
if not result:
logging.error(f"表达式计算失败: {calculator.get_last_error()}")
raise ValueError(f"表达式计算失败: {calculator.get_last_error()}")
error_msg = calculator.get_last_error()
logging.error(
f"[表达式计算失败] "
f"表达式='{expr_str}', "
f"变量值={var_values_log}, "
f"错误类型='{error_msg}', "
)
raise ValueError(f"表达式计算失败: {expr_str} (变量: {var_values_log}) => 错误: {error_msg}")
logging.debug(f"表达式计算成功: '{expr_str}' => {value}")
return BCLVariant(value)
except Exception as e:
raise e
# 捕获所有异常,打印完整堆栈和上下文
logging.error(
f"[_evaluate_expression] 未预期异常: {str(e)}\n"
f"表达式节点文本: {expr_node.get('text', 'N/A')}\n"
f"变量上下文: {[child.get('text') for child in expr_node if child.get('type') == '变量']}\n"
f"完整堆栈:\n{traceback.format_exc()}"
)
raise
def _call_function(self, func_name: str, node: ET.Element, context: BCLContext) -> BCLVariant: