self,
indent = '',
enclosing_loop = None,
- #initial = False,
translate_identifier = {
'NULL': 'None',
'false': 'False',
'true': 'True'
}
):
- self.indent = ' '
+ self.indent = indent
self.enclosing_loop = enclosing_loop
- #self.initial = initial # whether to add declared identifiers as 'self.'
self.translate_identifier = translate_identifier
class AST(element.Element):
return 'ast.AST.BlockItemList({0:s})'.format(', '.join(params))
# GENERATE END
def translate(self, context):
+ result = []
for i in self:
- i.translate(context)
- for i in range(len(self) + 1):
- element.set_text(self, i, '')
+ if isinstance(i, AST.StatementBlock):
+ assert isinstance(i[0], AST.BlockItemList)
+ i[0].translate(context)
+ result.extend(i[0])
+ else:
+ i.translate(context)
+ result.append(i)
+ self[:] = result
+ if len(self) == 0:
+ element.set_text(self, 0, '{0:s}pass\n'.format(context.indent))
+ else:
+ for i in range(len(self) + 1):
+ element.set_text(self, i, '')
class CommaEllipsis(Element):
# GENERATE ELEMENT() BEGIN
def translate(self, context):
assert len(self) == 3
self[0].translate(context)
- #initial_save = context.initial
- #context.initial = False
self[1].translate(context)
+ assert isinstance(self[1], AST.ParameterDeclarationList)
+ if len(self[1]) == 1:
+ assert isinstance(self[1][0], AST.ParameterDeclaration)
+ assert isinstance(self[1][0][0], AST.DeclarationSpecifierList)
+ if (
+ len(self[1][0][0]) == 1 and
+ isinstance(self[1][0][0][0], AST.TypeSpecifier) and
+ self[1][0][0][0].n == 0 and
+ isinstance(self[1][0][1], AST.DeclaratorAbstract)
+ ):
+ del self[1][:]
self[2].translate(context)
- #context.initial = initial_save
element.set_text(self, 0, '')
element.set_text(self, 1, '(')
element.set_text(self, 2, '')
def translate(self, context):
assert len(self) == 2
self[0].translate(context)
- #initial_save = context.initial
- #context.initial = False
self[1].translate(context)
- #context.initial = initial_save
element.set_text(self, 0, '')
element.set_text(self, 1, '(')
element.set_text(self, 2, ')')
self.repr_serialize(params)
return 'ast.AST.DeclaratorIdentifier({0:s})'.format(', '.join(params))
# GENERATE END
- def translate(self, context):
- #if context.initial:
- # text = element.get_text(self[0], 0)
- # assert text not in context.translate_identifier
- # context.translate_identifier[text] = 'self.{0:s}'.format(text)
- AST.Declarator.translate(self, context)
class DeclaratorPointer(Declarator):
# GENERATE ELEMENT() BEGIN
self.repr_serialize(params)
return 'ast.AST.FunctionDefinition({0:s})'.format(', '.join(params))
# GENERATE END
+ def translate(self, context):
+ assert len(self) == 4
+ del self[0]
+ self[0].translate(context)
+ del self[1]
+ indent_save = context.indent
+ context.indent += ' '
+ self[1].translate(context)
+ context.indent = indent_save
+ element.set_text(self, 0, '{0:s}def '.format(context.indent))
+ element.set_text(self, 1, ':\n')
+ element.set_text(self, 2, '')
class FunctionSpecifier(Element):
# GENERATE ELEMENT(int n) BEGIN
# GENERATE END
def translate(self, context):
assert len(self) == 1
+ indent_save = context.indent
+ context.indent += ' '
self[0].translate(context)
+ context.indent = indent_save
element.set_text(self, 0, '')
element.set_text(self, 1, '')
assert len(self) == 0
if isinstance(enclosing_loop, StatementDoWhile):
self.append(enclosing_loop[1].copy())
- indent_save = context.indent
- context.indent += ' '
self[0].translate(context)
- context.indent = indent_save
element.set_text(self, 0, '{0:s}if '.format(context.indent))
element.set_text(
self,
)
elif isinstance(enclosing_loop, StatementFor):
self.append(enclosing_loop[2].copy())
- indent_save = context.indent
- context.indent += ' '
self[0].translate(context)
- context.indent = indent_save
element.set_text(self, 0, '')
element.set_text(self, 1, '{0:s}continue\n'.format(context.indent))
else:
# GENERATE END
def translate(self, context):
assert len(self) == 2
- indent_save = context.indent
- context.indent += ' '
enclosing_loop_save = context.enclosing_loop
context.enclosing_loop = self
+ self[0] = AST.StatementBlock(
+ children = [
+ AST.BlockItemList(
+ children = [self[0]]
+ )
+ ]
+ )
self[0].translate(context)
context.enclosing_loop = enclosing_loop_save
self[1].translate(context)
- context.indent = indent_save
element.set_text(self, 0, '{0:s}while True:\n'.format(context.indent))
element.set_text(self, 1, '{0:s} if not ('.format(context.indent))
element.set_text(self, 2, '):\n{0:s} break\n'.format(context.indent))
# GENERATE END
def translate(self, context):
assert len(self) == 2
- indent_save = context.indent
- context.indent += ' '
self[0].translate(context)
+ self[1] = AST.StatementBlock(
+ children = [
+ AST.BlockItemList(
+ children = [self[1]]
+ )
+ ]
+ )
self[1].translate(context)
- context.indent = indent_save
element.set_text(self, 0, '{0:s}if '.format(context.indent))
element.set_text(self, 1, ':\n')
element.set_text(self, 2, '')
# GENERATE END
def translate(self, context):
assert len(self) == 3
- indent_save = context.indent
- context.indent += ' '
self[0].translate(context)
+ self[1] = AST.StatementBlock(
+ children = [
+ AST.BlockItemList(
+ children = [self[1]]
+ )
+ ]
+ )
self[1].translate(context)
+ self[2] = AST.StatementBlock(
+ children = [
+ AST.BlockItemList(
+ children = [self[2]]
+ )
+ ]
+ )
self[2].translate(context)
- context.indent = indent_save
element.set_text(self, 0, '{0:s}if '.format(context.indent))
element.set_text(self, 1, ':\n')
element.set_text(self, 2, '{0:s}else:\n'.format(context.indent))
# GENERATE END
def translate(self, context):
assert len(self) == 2
- indent_save = context.indent
- context.indent += ' '
self[0].translate(context)
enclosing_loop_save = context.enclosing_loop
context.enclosing_loop = self
+ self[1] = AST.StatementBlock(
+ children = [
+ AST.BlockItemList(
+ children = [self[1]]
+ )
+ ]
+ )
self[1].translate(context)
context.enclosing_loop = enclosing_loop_save
- context.indent = indent_save
element.set_text(self, 0, '{0:s}while '.format(context.indent))
element.set_text(self, 1, ':\n')
element.set_text(self, 2, '')
return 'ast.AST.UnionSpecifier({0:s})'.format(', '.join(params))
# GENERATE END
+ class TranslationUnit(Element):
+ # GENERATE ELEMENT() BEGIN
+ def __init__(
+ self,
+ tag = 'AST_TranslationUnit',
+ attrib = {},
+ text = '',
+ children = []
+ ):
+ AST.Element.__init__(
+ self,
+ tag,
+ attrib,
+ text,
+ children
+ )
+ def copy(self, factory = None):
+ result = AST.Element.copy(
+ self,
+ TranslationUnit if factory is None else factory
+ )
+ return result
+ def __repr__(self):
+ params = []
+ self.repr_serialize(params)
+ return 'ast.AST.TranslationUnit({0:s})'.format(', '.join(params))
+ # GENERATE END
+
# GENERATE ELEMENT() BEGIN
def __init__(
self,
'AST_TypeQualifierList': AST.TypeQualifierList,
'AST_TypeQualifierOrStaticList': AST.TypeQualifierOrStaticList,
'AST_TypeSpecifier': AST.TypeSpecifier,
- 'AST_UnionSpecifier': AST.UnionSpecifier
+ 'AST_UnionSpecifier': AST.UnionSpecifier,
+ 'AST_TranslationUnit': AST.TranslationUnit
}
def factory(tag, attrib = {}, *args, **kwargs):
return tag_to_class.get(tag, element.Element)(tag, attrib, *args, **kwargs)
#!/usr/bin/env python3
import ast
-import c_to_python
import element
+import lex_yy
import os
import sys
import xml.etree.ElementTree
-
-root = xml.etree.ElementTree.parse(
- sys.stdin,
- xml.etree.ElementTree.XMLParser(
- target = xml.etree.ElementTree.TreeBuilder(element.Element),
- encoding = 'unicode'
- )
-).getroot()
+import y_tab
def my_rstrip(text, indent):
i = len(text)
i -= 1
return text[:i].rstrip('\t ') + indent + text[i:]
+def c_to_python(context, text):
+ lex_yy.yyin = None
+ lex_yy.yy_buffer_stack = [lex_yy.YYBufferState(None, None)]
+ lex_yy.yytext_len = 0
+ lex_yy.unput(text)
+ root = y_tab.yyparse(ast.AST.TranslationUnit)
+ root.translate(context)
+ #print('@@@')
+ #xml.etree.ElementTree.dump(root)
+ return element.to_text(root)
+
+root = xml.etree.ElementTree.parse(
+ sys.stdin,
+ xml.etree.ElementTree.XMLParser(
+ target = xml.etree.ElementTree.TreeBuilder(element.Element),
+ encoding = 'unicode'
+ )
+).getroot()
+
context = ast.Context()
#context.translate_identifier['BEGIN'] = 'self.BEGIN'
#context.translate_identifier['yylval'] = 'ref_data.yylval'
pass
elif line[:11] == '@@@ IMPORT(' and line[-2:] == ')\n':
# make the importing look like a function call in the C code:
- lines.append('import("{0:s}");\n'.format(line[11:-2]))
+ #lines.append('import("{0:s}");\n'.format(line[11:-2]))
line = fin.readline()
while line != '@@@ IMPORT END\n':
assert len(line)
else:
lines.append(line)
line = fin.readline()
- context.indent = indent + ' '
- context.initial = initial
- text = c_to_python.c_to_python(context, ''.join(lines))
+ text = ''.join(lines)
+
if initial:
- element.set_text(i[0], 0, text)
+ context.indent = indent + ' '
+ text = c_to_python(context, text)
else:
assert parent.tag == 'AST_Section2_Rule'
assert len(parent) == 3
prefix = element.get_text(parent, 2).rstrip('\t ')
+ context.indent = indent
+ text = c_to_python(
+ context,
+ 'void a(void) {{\n{0:s}}}\n'.format(text)
+ )
+ assert text[:len(indent) + 9] == indent + 'def a():\n'
+ text = text[len(indent) + 9:]
if len(text) == 0:
text = '\n'
elif text == '\n':
indent
)
element.set_text(parent, 2, prefix)
- element.set_text(i[0], 0, text)
+ element.set_text(i[0], 0, text)
xml.etree.ElementTree.ElementTree(root).write(
sys.stdout,