from sys import argv from pathlib import Path import re placementChart = { 'a': 'above', 'b': 'below', 'l': 'left', 'r': 'right' } def generateEdge(inputLine): s_src, msg, opts, s_dest = inputLine.split(' ') out_options = [] if '(' in opts or ')' in opts: out_options.append('bend left' if '(' in opts else 'bend right') if any(x in opts for x in 'udlr'): out_options.append( 'above' if 'u' in opts else \ 'below' if 'd' in opts else \ 'left' if 'l' in opts else \ 'right' if 'r' in opts else '' ) if s_src == 'o': return f'\draw (s{s_dest}) edge[loop,{",".join(out_options)}] node{{{msg}}} (s{s_dest});' else: return f'\draw (s{s_src}) edge[{", ".join(out_options)}] node{{${msg}$}} (s{s_dest});' def generateNode(inputLine): s_src, opts = inputLine.split(' ') out_opts = [] if 's' in opts: out_opts.append('initial') if 'f' in opts: out_opts.append('accepting') if place := re.search('[udlr]\d+', opts): out_opts.append(placementChart[place.group()[0]] + ' of=s' + place.group()[1]) return f'\\node[state, {", ".join(out_opts)}] (s{s_src}) {{$s_{s_src}$}};' def generate_latex(inputLines): nodes, edges = inputLines.split('\n\n') output=[] for node in nodes.split('\n'): output.append(generateNode(node)) output.append('') for edge in edges.split('\n'): output.append(generateEdge(edge)) return '\n'.join(output) def processFileContent(raw, template): content = generate_latex(raw) return template.replace('%CONTENT', content) if __name__ == '__main__': filename = argv[1] with open(filename) as file: content = generate_latex(file.read()) with open(str(Path(__file__).parent.absolute()) + '/tex_templates/FSA.tex') as template: with open(argv[2], 'w') as destination_file: destination_file.write(template.read().replace('%CONTENT', content))