def unparsing_unsupported(language_name: str, syntax, comment: str = None, error: bool = True): unparsed = 'invalid' try: unparsed = '"""{}"""'.format(horast.unparse(syntax).strip()) except AttributeError: pass if comment is not None: comment = ' ' + comment _LOG.error('unparsing %s%s like """%s""" (%s in Python) is unsupported for %s', syntax.__class__.__name__, comment, horast.dump(syntax), unparsed, language_name) if error: raise SyntaxError( 'unparsing {}{} like """{}""" ({} in Python) is unsupported for {}'.format( syntax.__class__.__name__, comment, horast.dump(syntax), unparsed, language_name))
def test_auto_parser(self): for language_codename, paths in EXAMPLES_FILES.items(): language_name = EXAMPLES_LANGS_NAMES[language_codename] if language_name in NOT_PARSED_LANGS: continue language = Language.find(language_name) self.assertIsInstance(language, Language, msg=(language_codename, language_name)) auto_parser = GeneralizingAutoParser(language) reader = CodeReader() for path in paths: code = reader.read_file(path) with self.subTest(language_name=language_name, language=language): pair1 = auto_parser.parse_and_generalize(code, path) pair2 = auto_parser.parse_and_generalize_file(path) self.assertEqual(horast.dump(pair1), horast.dump(pair2))
def _BinOp(self, binop): if binop.op.__class__.__name__ in {'Pow'}: # TODO: implement Pow through pow(n, p) function raise NotImplementedError('not yet implemented: {}'.format(horast.dump(binop))) if binop.op.__class__.__name__ in self.binop_unsupported: self._unsupported_syntax(binop) super()._BinOp(binop)
def _BinOp(self, binop): if binop.op.__class__.__name__ in { 'Mod', 'LShift', 'RShift', 'BitOr', 'BitXor', 'BitAnd', 'MatMult'}: # TODO: implement Mod through MODULO(n, p) intrinsic # TODO: implement LShift through LSHIFT(n, p) intrinsic # TODO: implement RShift through RSHIFT(n, p) intrinsic # TODO: implement BitOr through IOR(k, j) intrinsic # TODO: implement BitXor through IEOR(k, j) intrinsic # TODO: implement BitAnd through IAND(k, j) intrinsic # TODO: implement MatMult through MATMUL(m1, m2) intrinsic raise NotImplementedError('not yet implemented: {}'.format(horast.dump(binop))) super()._BinOp(binop)