| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- const parser = require('@babel/parser');
- const traverse = require('@babel/traverse').default;
- const fs = require('fs');
- const code = `
- let state = 0, x = 5;
- while (1) {
- switch (state) {
- case 0:
- console.log('执行块 0 操作')
- state = 1;
- break;
- case 1:
- state = (x > 0) ? 2 : 3;
- console.log('执行块 1 操作')
- break;
- case 2:
- console.log('执行块 2 操作')
- state = 4;
- break;
- case 3:
- console.log('执行块 3 操作')
- state = 4;
- break;
- case 4:
- console.log('程序执行完毕');
- }
- }
- `;
- const ast = parser.parse(code, { sourceType: 'module' });
- let initialState = null;
- let switchCases = {};
- traverse(ast, {
- VariableDeclarator(path) {
- if (path.node.id.name === 'state') {
- initialState = path.node.init.value;
- }
- },
- SwitchCase(path) {
- const test = path.node.test.value;
- const body = path.node.consequent;
- let logs = [];
- let nextState = null;
- body.forEach(node => {
- if (
- node.type === 'ExpressionStatement' &&
- node.expression.type === 'CallExpression' &&
- node.expression.callee.object.name === 'console'
- ) {
- logs.push(node.expression.arguments[0].value);
- }
- if (
- node.type === 'ExpressionStatement' &&
- node.expression.type === 'AssignmentExpression' &&
- node.expression.left.name === 'state'
- ) {
- nextState = node.expression.right;
- }
- });
- switchCases[test] = { logs, nextState };
- }
- });
- function formatNextState(nextState) {
- if (nextState.type === 'ConditionalExpression') {
- return `if (${generateCode(nextState.test)}) {
- ${switchCases[nextState.consequent.value].logs.map(log => `console.log('${log}')`).join('\n ')}
- } else {
- ${switchCases[nextState.alternate.value].logs.map(log => `console.log('${log}')`).join('\n ')}
- }`;
- } else if (nextState.type === 'NumericLiteral') {
- const logs = switchCases[nextState.value]?.logs || [];
- return logs.map(log => `console.log('${log}')`).join('\n');
- } else {
- return '// 未识别的跳转';
- }
- }
- function generateCode(node) {
- if (node.type === 'BinaryExpression') {
- return `${node.left.name} ${node.operator} ${node.right.value}`;
- }
- return '// 未识别表达式';
- }
- // 🌳 生成结构化代码
- let outputCode = '';
- outputCode += switchCases[0].logs.map(log => `console.log('${log}')`).join('\n') + '\n';
- outputCode += formatNextState(switchCases[1].nextState) + '\n';
- outputCode += switchCases[4].logs.map(log => `console.log('${log}')`).join('\n');
- console.log('\n✅ 结构化还原后的代码:\n');
- console.log(outputCode);
|