Commit 4b427fb6 authored by Tom Niget's avatar Tom Niget

Start work on exprs

parent 2f8bdf7b
...@@ -23,4 +23,4 @@ ...@@ -23,4 +23,4 @@
if __name__ == "__main__": if __name__ == "__main__":
print(5) print("abc")
\ No newline at end of file \ No newline at end of file
This diff is collapsed.
import ast import ast
from dataclasses import dataclass from dataclasses import dataclass, field
from typing import Iterable, Optional from typing import Iterable, Optional
from transpiler.phases.emit_cpp.expr import ExpressionVisitor
from transpiler.phases.typing.scope import Scope from transpiler.phases.typing.scope import Scope
from transpiler.phases.emit_cpp.visitors import NodeVisitor, flatmap from transpiler.phases.emit_cpp.visitors import NodeVisitor, flatmap, CoroutineMode
from transpiler.phases.typing.types import CallableInstanceType, BaseType from transpiler.phases.typing.types import CallableInstanceType, BaseType
...@@ -23,11 +23,10 @@ def emit_function(name: str, func: CallableInstanceType) -> Iterable[str]: ...@@ -23,11 +23,10 @@ def emit_function(name: str, func: CallableInstanceType) -> Iterable[str]:
if False: @dataclass
@dataclass class BlockVisitor(NodeVisitor):
class BlockVisitor(NodeVisitor):
scope: Scope scope: Scope
#generator: CoroutineMode = field(default=CoroutineMode.SYNC, kw_only=True) generator: CoroutineMode = field(default=CoroutineMode.SYNC, kw_only=True)
def expr(self) -> ExpressionVisitor: def expr(self) -> ExpressionVisitor:
return ExpressionVisitor(self.scope, self.generator) return ExpressionVisitor(self.scope, self.generator)
...@@ -38,34 +37,34 @@ if False: ...@@ -38,34 +37,34 @@ if False:
# def visit_FunctionDef(self, node: ast.FunctionDef) -> Iterable[str]: # def visit_FunctionDef(self, node: ast.FunctionDef) -> Iterable[str]:
# yield from self.visit_free_func(node) # yield from self.visit_free_func(node)
def visit_free_func(self, node: ast.FunctionDef, emission: FunctionEmissionKind) -> Iterable[str]: # def visit_free_func(self, node: ast.FunctionDef, emission: FunctionEmissionKind) -> Iterable[str]:
if getattr(node, "is_main", False): # if getattr(node, "is_main", False):
if emission == FunctionEmissionKind.DECLARATION: # if emission == FunctionEmissionKind.DECLARATION:
return # return
# Special case handling for Python's interesting way of defining an entry point. # # Special case handling for Python's interesting way of defining an entry point.
# I mean, it's not *that* bad, it's just an attempt at retrofitting an "entry point" logic in a scripting # # I mean, it's not *that* bad, it's just an attempt at retrofitting an "entry point" logic in a scripting
# language that, by essence, uses "the start of the file" as the implicit entry point, since files are # # language that, by essence, uses "the start of the file" as the implicit entry point, since files are
# read and executed line-by-line, contrary to usual structured languages that mark a distinction between # # read and executed line-by-line, contrary to usual structured languages that mark a distinction between
# declarations (functions, classes, modules, ...) and code. # # declarations (functions, classes, modules, ...) and code.
# Also, for nitpickers, the C++ standard explicitly allows for omitting a `return` statement in the `main`. # # Also, for nitpickers, the C++ standard explicitly allows for omitting a `return` statement in the `main`.
# 0 is returned by default. # # 0 is returned by default.
yield "typon::Root root() const" # yield "typon::Root root() const"
#
def block(): # def block():
yield from node.body # yield from node.body
yield ast.Return() # yield ast.Return()
#
from transpiler.phases.emit_cpp.function import FunctionVisitor # from transpiler.phases.emit_cpp.function import FunctionVisitor
yield "{" # yield "{"
yield from self.visit_func_decls(block(), node.scope, CoroutineMode.TASK) # yield from self.visit_func_decls(block(), node.scope, CoroutineMode.TASK)
yield "}" # yield "}"
return # return
#
if emission == FunctionEmissionKind.DECLARATION: # if emission == FunctionEmissionKind.DECLARATION:
yield f"struct {node.name}_inner {{" # yield f"struct {node.name}_inner {{"
yield from self.visit_func_new(node, emission) # yield from self.visit_func_new(node, emission)
if emission == FunctionEmissionKind.DECLARATION: # if emission == FunctionEmissionKind.DECLARATION:
yield f"}} {node.name};" # yield f"}} {node.name};"
def visit_func_decls(self, body: list[ast.stmt], inner_scope: Scope, mode = CoroutineMode.ASYNC) -> Iterable[str]: def visit_func_decls(self, body: list[ast.stmt], inner_scope: Scope, mode = CoroutineMode.ASYNC) -> Iterable[str]:
for child in body: for child in body:
......
import ast import ast
from enum import Flag
from itertools import chain from itertools import chain
from typing import Iterable from typing import Iterable
...@@ -89,3 +90,11 @@ def join(sep: str, items: Iterable[Iterable[str]]) -> Iterable[str]: ...@@ -89,3 +90,11 @@ def join(sep: str, items: Iterable[Iterable[str]]) -> Iterable[str]:
def flatmap(f, items): def flatmap(f, items):
return chain.from_iterable(map(f, items)) return chain.from_iterable(map(f, items))
class CoroutineMode(Flag):
SYNC = 1
FAKE = 2 | SYNC
ASYNC = 4
GENERATOR = 8 | ASYNC
TASK = 16 | ASYNC
JOIN = 32 | ASYNC
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment