self.repr_serialize(params)
return 'ast.AST.Type({0:s})'.format(', '.join(params))
# GENERATE END
+ def translate_size(self, context):
+ print(self)
+ raise NotImplementedError
+ def translate_type(self, context):
+ print(self)
+ raise NotImplementedError
def translate_zero(self, context):
print(self)
raise NotImplementedError
# GENERATE END
def __str__(self):
return '{0:s}int{1:d}'.format(['u', ''][int(self.signed)], self.bits)
+ def translate_size(self, context):
+ return (self.bits + 7) // 8
+ def translate_type(self, context):
+ return 'int'
def translate_zero(self, context):
return '0' if context.top_level else 'None'
['', 'i', 'c'][int(self.complex)],
self.bits
)
+ def translate_size(self, context):
+ return (self.bits + 7) // 8
+ def translate_type(self, context):
+ return 'float'
def translate_zero(self, context):
return '0.' if context.top_level else 'None'
# GENERATE END
def __str__(self):
return 'bool'
+ def translate_size(self, context):
+ return 1
+ def translate_type(self, context):
+ return 'bool'
def translate_zero(self, context):
return 'False' if context.top_level else 'None'
# GENERATE END
def __str__(self):
return 'pointer<{0:s}>'.format(str(self.target_type))
+ def translate_size(self, context):
+ return 4
+ def translate_type(self, context):
+ assert (
+ isinstance(self.target_type, AST.TypeInt) and
+ self.target_type.bits == 8
+ )
+ return 'str'
def translate_zero(self, context):
- assert isinstance(target_type, TypeInt) and target_type.bits == 8
+ assert (
+ isinstance(self.target_type, AST.TypeInt) and
+ self.target_type.bits == 8
+ )
return '\'\'' if context.top_level else 'None'
class TypeArray(Type):
str(self.element_count)
)
)
+ def translate_size(self, context):
+ return self.element_type.translate_type(context) * self.element_count
def translate_zero(self, context):
return '[{0:s}]'.format(
', '.join(
return 'ast.AST.TypeFunction({0:s})'.format(', '.join(params))
# GENERATE END
def __str__(self):
- return 'function<{0:s}: {1:s}>'.format(
- str(self.return_type),
+ return 'function<{0:s} -> {1:s}>'.format(
(
'void'
if len(self) == 0 else
', '.join(
- [str(i) for i in self] + (['...'] if self.is_varargs else [])
+ [str(i) for i in self] + (['...'] if self.varargs else [])
)
- )
+ ),
+ str(self.return_type)
)
# syntax classes
base_type = self[0].get_type()
for i in self[1]:
type, name = i[0].get_type_and_name(base_type)
- context.lines.append(
- '{0:s}{1:s} = {2:s}\n'.format(
- context.indent,
- name,
- (
- type.translate_zero(context)
- if isinstance(i[1], AST.EqualsInitializerEmpty) else
- i[1].translate_expression(context, 0)
+ if not isinstance(type, AST.TypeFunction):
+ context.lines.append(
+ '{0:s}{1:s} = {2:s}\n'.format(
+ context.indent,
+ name,
+ (
+ type.translate_zero(context)
+ if isinstance(i[1], AST.EqualsInitializerEmpty) else
+ i[1].translate_expression(context, 0)
+ )
)
)
- )
class DeclarationList(element.Element):
# GENERATE ELEMENT() BEGIN
self.repr_serialize(params)
return 'ast.AST.ExpressionCast({0:s})'.format(', '.join(params))
# GENERATE END
+ def translate_expression(self, context, precedence):
+ type, _ = self[0][1].get_type_and_name(self[0][0].get_type())
+ text = '{0:s}({1:s})'.format(
+ type.translate_type(context),
+ self[1].translate_expression(context, 0)
+ )
+ if 14 < precedence:
+ text = '({0:s})'.format(text)
+ return text
class ExpressionCharConstant(Expression):
# GENERATE ELEMENT() BEGIN
def translate_expression(self, context, precedence):
text = '{0:s}.{1:s}'.format(
self[0].translate_expression(context, 14),
- element.get_text(self[1], 0)
+ self[1].translate_identifier(context)
)
if 14 < precedence:
text = '({0:s})'.format(text)
def translate_expression(self, context, precedence):
text = '{0:s}->{1:s}'.format(
self[0].translate_expression(context, 14),
- element.get_text(self[1], 0)
+ self[1].translate_identifier(context)
)
if 14 < precedence:
text = '({0:s})'.format(text)
return 'ast.AST.ExpressionIdentifier({0:s})'.format(', '.join(params))
# GENERATE END
def translate_expression(self, context, precedence):
- return element.get_text(self[0], 0)
+ return self[0].translate_identifier(context)
class ExpressionIndex(Expression):
# GENERATE ELEMENT() BEGIN
self.repr_serialize(params)
return 'ast.AST.Identifier({0:s})'.format(', '.join(params))
# GENERATE END
+ def translate_identifier(self, context):
+ text = element.get_text(self, 0)
+ return context.translate_identifier.get(text, text)
class ExpressionLeftShiftAssignment(ExpressionBinary):
# GENERATE ELEMENT() BEGIN
self.repr_serialize(params)
return 'ast.AST.ExpressionSizeOfType({0:s})'.format(', '.join(params))
# GENERATE END
+ def translate_expression(self, context, precedence):
+ type, _ = self[0][1].get_type_and_name(self[0][0].get_type())
+ return str(type.translate_size(context))
class ExpressionStringLiteral(Expression):
# GENERATE ELEMENT() BEGIN
self.repr_serialize(params)
return 'ast.AST.ExpressionStringLiteral({0:s})'.format(', '.join(params))
# GENERATE END
+ def translate_expression(self, context, precedence):
+ return '\'{0:s}\''.format(
+ element.get_text(self[0], 0).replace('\\"', '"').replace('\'', '\\\'')
+ )
class ExpressionSubtract(ExpressionBinary):
# GENERATE ELEMENT() BEGIN
type, name = self[1].get_type_and_name(self[0].get_type())
assert isinstance(type, AST.TypeFunction)
context.lines.append(
- '{0:s}def {1:s}({2:s}):\n'.format(
+ '\n{0:s}def {1:s}({2:s}):\n'.format(
context.indent,
name,
', '.join([i.name for i in type])
self.repr_serialize(params)
return 'ast.AST.SpecifierQualifierList({0:s})'.format(', '.join(params))
# GENERATE END
+ def get_type(self):
+ type_specifiers = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+ for i in self:
+ if isinstance(i, AST.TypeSpecifier):
+ type_specifiers[i.n] += 1
+ return type_specifiers_to_type[tuple(type_specifiers)]
class StatementBlock(Statement):
# GENERATE ELEMENT() BEGIN
return 'ast.AST.StatementDoWhile({0:s})'.format(', '.join(params))
# GENERATE END
def translate_declaration_or_statement(self, context):
+ if (
+ isinstance(self[1], AST.ExpressionIntLiteral) and
+ element.get_text(self[1], 0) == '0'
+ ):
+ self[0].translate_declaration_or_statement(context)
+ return
context.lines.append('{0:s}while True:\n'.format(context.indent))
indent_save = context.indent
context.indent += ' '
self.repr_serialize(params)
return 'ast.AST.StatementReturn({0:s})'.format(', '.join(params))
# GENERATE END
-
+ def translate_declaration_or_statement(self, context):
+ context.lines.append(
+ '{0:s}return {1:s}\n'.format(
+ context.indent,
+ self[0].translate_expression(context, 0)
+ )
+ )
+
class StatementSwitch(Statement):
# GENERATE ELEMENT() BEGIN
def __init__(
(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0): AST.TypeInt(signed = True, bits = 16),
(0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0): AST.TypeInt(signed = True, bits = 16),
(0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0): AST.TypeInt(signed = False, bits = 16),
+ (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0): AST.TypeInt(signed = True, bits = 32),
(0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0): AST.TypeInt(signed = True, bits = 32),
(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0): AST.TypeInt(signed = True, bits = 32),
(0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0): AST.TypeInt(signed = False, bits = 32),
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)
+ context.lines = []
+ root.translate_translation_unit(context)
+ return ''.join(context.lines)
root = xml.etree.ElementTree.parse(
sys.stdin,
with open('a.c', 'w') as fout:
def extract(i, parent, indent):
if i.tag == 'AST_Section1Or2_CodeBlock':
+ node = i[0]
+ assert node.tag == 'AST_Text'
+ indent += ' '
initial = True
elif i.tag == 'AST_Section2_Rule_Action':
if len(i) == 0: # continued actions
element.get_text(parent, 2).rstrip('\t ') + ' /*COLUMN32*/ '
)
return
+ node = i[0]
+ assert node.tag == 'AST_Text'
initial = False
+ elif i.tag == 'AST_Section3':
+ node = i
+ initial = True
else:
child_indent = indent
- if i.tag == 'AST_Section1_StartConditions':
+ if i.tag == 'AST':
+ for j in range(1, len(i) + 1):
+ element.set_text(i, j, element.get_text(i, j).rstrip() + '\n')
+ elif i.tag == 'AST_Section1_StartConditions':
for j in i:
assert j.tag == 'AST_Name'
text = element.get_text(j, 0)
for j in i:
extract(j, i, child_indent)
return
- assert i[0].tag == 'AST_Text' and len(i[0]) == 0
- text = element.to_text(i[0])
+ assert len(node) == 0
+ text = element.get_text(node, 0)
j = 0
while j < len(text):
fout.write(line)
fout.write('@@@\n')
- actions.append((i, parent, indent, initial))
+ actions.append((node, parent, indent, initial))
extract(root, None, '')
os.system('gcc -I tests/flex_h -E a.c >a.i')
with open('a.i') as fin:
- for i, parent, indent, initial in actions:
+ for node, parent, indent, initial in actions:
lines = []
line = fin.readline()
while line != '@@@\n':
text = ''.join(lines)
if initial:
- context.indent = indent + ' '
+ context.indent = indent
text = c_to_python(context, text)
else:
assert parent.tag == 'AST_Section2_Rule'
context,
'void a(void) {{\n{0:s}}}\n'.format(text)
)
- assert text[:len(indent) + 9] == indent + 'def a():\n'
- text = text[len(indent) + 9:]
+ assert text[:len(indent) + 10] == '\n{0:s}def a():\n'.format(indent)
+ text = text[len(indent) + 10:]
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(node, 0, text)
xml.etree.ElementTree.ElementTree(root).write(
sys.stdout,