Esempio n. 1
0
def compile(src, filename, mode='exec', showTree=False, importlogix=True,
            module=None):
    global lineno
    lineno = 0
    global modulename
    modulename = module

    implogix = ast.Import([(logixModuleName, 'logix')])
    prepend = importlogix and [implogix] or None

    if len(src) == 0:
        src = [None]

    try:
        if mode == "exec":
            statements = block(src, False, prepend)
            tree = ast.Module(None, statements)
            gen = pycodegen.ModuleCodeGenerator

        else:
            assert len(src) == 1
            stmt = src[0]

            if mode == "single":
                statements = block([stmt], False, prepend=prepend)
                tree = ast.Module(None, statements)
                gen = pycodegen.InteractiveCodeGenerator

            elif mode == "eval":
                statements = block([stmt], True, prepend)
                tree = ast.Expression(statements)
                gen = pycodegen.ExpressionCodeGenerator
            else:
                raise ValueError("compile() 3rd arg must be 'exec' or "
                                 "'eval' or 'single'")
    except CompileError, exc:
        offset = None
        raise SyntaxError(str(exc), (filename, lineno, offset, None))
Esempio n. 2
0
def test_data_vector_with_complex_function():
    source = """
        import System::Output;

        export data Vector(x: i32, y: i32) {
            function add(self: Vector, other: Vector): Vector {
                Vector(x = self.x + other.x, y = self.y + other.y);
            }
        }

        export function Main(): void {

        }
     """
    result = get_semantic_analysis(source)

    assert_equal_programs(
        result,
        ast.Program(
            imports=[ast.Import(value="System::Output")],
            traits=[],
            data_defs=[
                ast.DataDef(
                    name="Vector",
                    implements=[],
                    is_exported=True,
                    params=[
                        ast.Param(name="x",
                                  type=types.Field(name="x",
                                                   type=types.I32())),
                        ast.Param(name="y",
                                  type=types.Field(name="y",
                                                   type=types.I32())),
                    ],
                    functions=[
                        ast.Function(
                            name="add",
                            is_exported=False,
                            params=[
                                ast.Param(
                                    name="self",
                                    type=types.Param(
                                        name="self",
                                        type=types.TypeRef(name="Vector")),
                                ),
                                ast.Param(
                                    name="other",
                                    type=types.Param(
                                        name="other",
                                        type=types.TypeRef(name="Vector")),
                                ),
                            ],
                            type=types.Function(
                                name="add",
                                params=[
                                    types.Param(
                                        name="self",
                                        type=types.TypeRef(name="Vector")),
                                    types.Param(
                                        name="other",
                                        type=types.TypeRef(name="Vector")),
                                ],
                                result=types.TypeRef(name="Vector"),
                            ),
                            body=[
                                ast.FunctionCall(
                                    name="Vector",
                                    arguments=[
                                        ast.Argument(
                                            name="x",
                                            value=ast.BinaryOperation(
                                                operator=ast.BinaryOperator.
                                                ADD,
                                                left=ast.MemberAccess(
                                                    value=ast.Variable(
                                                        name="self"),
                                                    member="x",
                                                ),
                                                right=ast.MemberAccess(
                                                    value=ast.Variable(
                                                        name="other"),
                                                    member="x",
                                                ),
                                            ),
                                        ),
                                        ast.Argument(
                                            name="y",
                                            value=ast.BinaryOperation(
                                                operator=ast.BinaryOperator.
                                                ADD,
                                                left=ast.MemberAccess(
                                                    value=ast.Variable(
                                                        name="self"),
                                                    member="y",
                                                ),
                                                right=ast.MemberAccess(
                                                    value=ast.Variable(
                                                        name="other"),
                                                    member="y",
                                                ),
                                            ),
                                        ),
                                    ],
                                )
                            ],
                        )
                    ],
                    type=types.Data(
                        name="Vector",
                        implements=[],
                        fields=[
                            types.Field(name="x", type=types.I32()),
                            types.Field(name="y", type=types.I32()),
                        ],
                        functions=[],
                    ),
                )
            ],
            functions=[
                ast.Function(
                    name="Main",
                    is_exported=True,
                    params=[],
                    type=types.Function(name="Main",
                                        params=[],
                                        result=types.Void()),
                    body=[],
                )
            ],
        ),
    )
Esempio n. 3
0
 def _do_ImportStatement(self, node):
     names = [name.MakeString() for name in node.Names]
     as_names = map(str, node.AsNames)
     names = zip(names, as_names)
     return ast.Import(names)
Esempio n. 4
0
def p_import_stmt(
        p):  # extremely oversimplified. "from","dots","as" to be done
    """import_stmt  :   IMPORT NAME
    """
    p[0] = ast.Import(p[2])