2025-03-02 21:48:41 +01:00

73 lines
2.8 KiB
Python

import json
import re
import argparse
import os
class Transpiler:
def __init__(self, mapping_file):
"""Initialize the transpiler with a JSON mapping file."""
with open(mapping_file, 'r') as f:
self.mapping = json.load(f)
# Create reverse mapping for Python to custom language
self.reverse_mapping = {v: k for k, v in self.mapping.items()}
# Sort keywords by length (descending) to avoid partial replacements
self.sorted_keywords = sorted(self.mapping.keys(), key=len, reverse=True)
self.sorted_reverse_keywords = sorted(self.reverse_mapping.keys(), key=len, reverse=True)
# Create regex patterns for word boundaries
self.patterns = {k: re.compile(r'\b' + re.escape(k) + r'\b') for k in self.sorted_keywords}
self.reverse_patterns = {k: re.compile(r'\b' + re.escape(k) + r'\b') for k in self.sorted_reverse_keywords}
def to_python(self, source_code):
"""Convert custom language to Python."""
result = source_code
for keyword in self.sorted_keywords:
result = self.patterns[keyword].sub(self.mapping[keyword], result)
return result
def from_python(self, python_code):
"""Convert Python to custom language."""
result = python_code
for keyword in self.sorted_reverse_keywords:
result = self.reverse_patterns[keyword].sub(self.reverse_mapping[keyword], result)
return result
def transpile_file(self, input_file, output_file=None, reverse=False):
"""Transpile a file from custom language to Python or vice versa."""
with open(input_file, 'r') as f:
source = f.read()
if reverse:
result = self.from_python(source)
else:
result = self.to_python(source)
if output_file:
with open(output_file, 'w') as f:
f.write(result)
return f"Transpiled to {output_file}"
else:
return result
def main():
parser = argparse.ArgumentParser(description='Transpile between custom language and Python')
parser.add_argument('input_file', help='Input file to transpile')
parser.add_argument('-o', '--output', help='Output file (if not specified, prints to stdout)')
parser.add_argument('-m', '--mapping', required=True, help='JSON mapping file')
parser.add_argument('-r', '--reverse', action='store_true', help='Transpile from Python to custom language')
args = parser.parse_args()
transpiler = Transpiler(args.mapping)
if args.output:
result = transpiler.transpile_file(args.input_file, args.output, args.reverse)
print(result)
else:
result = transpiler.transpile_file(args.input_file, reverse=args.reverse)
print(result)
if __name__ == "__main__":
main()