tools-scripts/Complie-script/comple/comple-script.mjs

119 lines
4.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import fs from 'fs';
import path from 'path';
import { Lexer } from './lexer.mjs'; // 引入 Lexer 类
// 递归遍历项目目录
function findXSchemaDirectory(directoryPath) {
fs.readdir(directoryPath, (err, files) => {
if (err) {
console.error('无法读取目录:', err);
return;
}
// 遍历目录中的所有文件和文件夹
files.forEach(file => {
const filePath = path.join(directoryPath, file);
fs.stat(filePath, (err, stats) => {
if (err) {
console.error('无法获取文件状态:', err);
return;
}
if (stats.isDirectory()) {
// 如果是文件夹,检查是否为 xschema 文件夹
if (file === 'xschema') {
// 找到 xschema 文件夹,继续查找其中的 .xschema.tsx 文件
findXSchemaFiles(filePath);
} else {
// 如果是其他文件夹,递归调用
findXSchemaDirectory(filePath);
}
}
});
});
});
}
// 查找 xschema 文件夹中的 .xschema.tsx 文件
function findXSchemaFiles(directoryPath) {
fs.readdir(directoryPath, (err, files) => {
if (err) {
console.error('无法读取目录:', err);
return;
}
files.forEach(file => {
const filePath = path.join(directoryPath, file);
// 如果是 .xschema.tsx 文件,进行处理
if (file.endsWith('.xschema.tsx')) {
processFile(filePath);
}
});
});
}
// 处理找到的 .xschema.tsx 文件
function processFile(filePath) {
console.log('找到文件:', filePath);
// 读取文件内容
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
console.error('无法读取文件:', err);
return;
}
// 在这里创建一个 Lexer 实例并进行词法分析
const lexer = new Lexer(data); // 创建 Lexer 实例
const tokens = lexer.lex(); // 获取 tokens
// 打印出解析得到的 tokens或者根据需要进行进一步处理
console.log('生成的 Tokens:', tokens);
// 进行编译
const compiledData = compileFile(data, tokens);
// 输出编译后的数据并保存为 .tsx 文件(去除 xschema 部分)
const outputFilePath = filePath.replace('.xschema.tsx', '.schema.ts'); // 输出文件名去除 xschema 部分,保留 .tsx 后缀
fs.writeFile(outputFilePath, compiledData, 'utf8', (err) => {
if (err) {
console.error('无法写入 TSX 文件:', err);
} else {
console.log('编译后的文件已保存:', outputFilePath);
}
});
});
}
function compileFile(fileContent, tokens) {
let compiledCode = '';
tokens.forEach(token => {
if (token === 'startTag') {
// 输出 'startTag' 标记
compiledCode += `Start Tag: ${tokens[1]} \n`;
// 输出属性
tokens[2].forEach(attr => {
const key = Object.keys(attr)[0]; // 获取属性名
const value = attr[key]; // 获取属性值
compiledCode += ` Attribute: ${key}="${value}" \n`;
});
}
else if (token === 'endTag') {
// 输出 'endTag' 标记(如果有的话)
compiledCode += `End Tag: ${tokens[1]} \n`;
}
else if (token === 'text') {
// 输出文本内容
compiledCode += `Text: ${tokens[1]} \n`;
}
});
return compiledCode; // 返回生成的简单 token 输出
}
// 启动程序并从根目录开始查找 xschema 文件夹
const projectRootDirectory = './'; // 设置项目根目录,通常为当前目录
findXSchemaDirectory(projectRootDirectory);