import type { VmValue } from '@mirascript/mirascript'; import type { Scope } from './scope.js'; import type { ExpressionSource } from './expression.js'; import { BaseState } from './migrator/state.js'; import { Evaluator } from './main.js'; import { DefaultVmContext } from '@mirascript/mirascript/subtle'; const evaluator = new Evaluator(); /** MathJs 表达式转为 MiraScript 表达式 */ function migrate( expr: ExpressionSource, condition: boolean, context: Scope | undefined, ): ExpressionSource { const dispose = context?.reset(evaluator); try { const state = new BaseState(expr, condition, context ? context.proxy : DefaultVmContext); state.migrate(); return state.result() as ExpressionSource; } finally { dispose?.(); } } /** MathJs 表达式转为 MiraScript 表达式 */ export function migrateMathJs( expr: ExpressionSource, condition: boolean, context: Scope | undefined, ): ExpressionSource { // 检查输入 if (!expr) return '' as ExpressionSource; expr = expr.trim() as ExpressionSource; if (!expr || expr === 'undefined') return '' as ExpressionSource; if (expr === 'null' || expr === 'nil') return 'nil' as ExpressionSource; if (expr === 'true') return 'true' as ExpressionSource; if (expr === 'false') return 'false' as ExpressionSource; if (condition) { // 兼容旧的 evaluateCondition 的宽容处理 if (expr === 'True' || expr === 'TRUE' || expr === '1' || expr === '"1"' || expr === "'1'") return 'true' as ExpressionSource; if ( expr === 'False' || expr === 'FALSE' || expr === '0' || expr === '"0"' || expr === "'0'" || expr === '""' || expr === "''" ) return 'false' as ExpressionSource; } if (/^[-+]?(\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)$/.test(expr)) { return expr; } return migrate(expr, condition, context); }