1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
import uuid
import graphviz as gv
from pprint import pformat
from dataclasses import dataclass
from typing import List
from enum import Enum
from astree.graphable import Graphable
from tabla import Token
Type = None
# A built-in primitive type (int, bool, str, etc).
class BuiltinType(Enum):
BOOLEAN = Token.BOOLEAN
STRING = Token.STRING
CHAR = Token.CHAR
INT = Token.INT
VOID = Token.VOID
def __str__(self):
return self.value.value
# A parameter to a function type.
@dataclass
class FuncParam(Graphable):
name: str
_type: Type
def graph(self, dot: gv.Digraph, parent: str = None, edge: str = None) -> None:
name = uuid.uuid1().hex
dot.node(name, 'FuncParam')
dot.edge(parent, name, label = edge)
name_name = uuid.uuid1().hex
dot.node(name_name, self.name)
dot.edge(name, name_name, 'name')
name_type = uuid.uuid1().hex
dot.node(name_type, str(self._type))
dot.edge(name, name_type, 'type')
# funcion vacio ... (a: int, b: int ...)
@dataclass
class FuncType(Graphable):
result: Type
params: List[FuncParam]
def graph(self, dot: gv.Digraph, parent: str = None, edge: str = None) -> None:
name = uuid.uuid1().hex
dot.node(name, 'FuncType')
dot.edge(parent, name, label = edge)
name_result = uuid.uuid1().hex
dot.node(name_result, str(self.result))
dot.edge(name, name_result, 'result')
for p in self.params:
p.graph(dot, name, 'param')
Type = BuiltinType
|