Example #1
0
 def invoke_macro(self, macro, args, original_parser):
     parsed_args = []
     for arg in args:
         p = Parser(arg)
         p.changequote('[',']')
         macro_handler.add_macros(MACROS, p)
         stream = StringIO()
         p.parse(stream=stream)
         parsed_args.append(stream.getvalue())
     return getattr(self, macro)(parsed_args)
Example #2
0
 def check_file(self, input_file, expected_file, thing):
     expected = open(expected_file, 'r').read()
     if thing == 'm4':
         # check m4 output
         m4_output = subprocess.check_output(['m4', input_file])
         self.assertEqual(m4_output, expected)
     elif thing == 'parser':
         stream = StringIO()
         Parser(open(input_file, 'r').read()).parse(stream=stream)
         self.assertEqual(stream.getvalue(), expected)
Example #3
0
    def translate(self, shell, toplevel=False):
        commands, leftover = pyshyacc.parse(shell, True)
        if toplevel:
            return self.translate_toplevel(commands)
        return flatten(self.translate_commands(commands))

    def translate_toplevel(self, commands):
        main = filter(lambda x: isinstance(x, ast.FunctionDef) and x.name == 'main', self.template.body)[0]
        main.body.extend(flatten(self.translate_commands(commands)))
        substassign = filter(lambda x: isinstance(x, ast.Assign) and x.targets[0].id == 'SUBSTS', self.template.body)[0]
        substassign.value.args = [ast.List([ast.Str(s) for s in self.macro_handler.substs], ast.Load())]
        make_arg_parser = filter(lambda x: isinstance(x, ast.FunctionDef) and x.name == 'make_arg_parser', self.template.body)[0]
        make_arg_parser.body[-1:-1] = self.make_argparse_arguments()


p = Parser(sys.stdin.read())
p.changequote('[',']')
macro_handler = MacroHandler()
macro_handler.add_macros(MACROS, p)

stream = StringIO()
# Parse m4
p.parse(stream=stream)
shell = stream.getvalue()
if len(sys.argv) > 1:
    sys.stdout.write(shell)
    sys.exit(0)

# now translate shell to Python
template_file = os.path.join(os.path.dirname(__file__), 'template.py')
template = ast.parse(open(template_file, 'r').read())
Example #4
0
 def test_macro_args_nested_parens(self):
     p = Parser('foo(abc(xyz)abc)')
     p.define('foo', 'bar')
     self.assertEqual(self.parse(p), 'bar')
Example #5
0
 def test_define_argparse(self):
     p = Parser('define( abc, xyz)abc')
     self.assertEqual(self.parse(p), 'xyz')
Example #6
0
 def test_changequote(self):
     p = Parser("`abc'[xyz]")
     p.changequote('[', ']')
     self.assertEqual(self.parse(p), "`abc'xyz")
Example #7
0
 def test_define_recursive(self):
     p = Parser('abc')
     p.define('abc', 'xyz')
     p.define('xyz', '123')
     self.assertEqual(self.parse(p), '123')
Example #8
0
 def test_define_simple_trailing(self):
     p = Parser('abc ')
     p.define('abc', 'xyz')
     self.assertEqual(self.parse(p), 'xyz ')
Example #9
0
 def test_define_empty(self):
     p = Parser('abc')
     p.define('abc')
     self.assertEqual(self.parse(p), '')
Example #10
0
 def test_empty_string(self):
     p = Parser("`'")
     self.assertEqual(self.parse(p), '')
Example #11
0
 def test_basic(self):
     p = Parser('abc')
     self.assertEqual(self.parse(p), 'abc')