aboutsummaryrefslogtreecommitdiff
path: root/compilador/parse/type.py
diff options
context:
space:
mode:
Diffstat (limited to 'compilador/parse/type.py')
-rw-r--r--compilador/parse/type.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/compilador/parse/type.py b/compilador/parse/type.py
new file mode 100644
index 0000000..27b83d3
--- /dev/null
+++ b/compilador/parse/type.py
@@ -0,0 +1,63 @@
+from typing import List
+
+from parse.base import BaseParser
+from lexer import LexToken, Token
+from astree.type import Type, BuiltinType, FuncType, FuncParam
+from errors import Error
+
+class ParseType:
+ def __init__(self, parser: BaseParser):
+ self.parser = parser
+
+ def _type(self) -> (Type | Error):
+ types = [Token.BOOLEAN, Token.CHAR, Token.INT, Token.STRING, Token.VOID]
+ tok = self.parser.want(*types)
+ if type(tok) is Error:
+ return tok
+ return BuiltinType(tok.tipo)
+
+ def prototype(self) -> (FuncType | Error):
+ params: List[FuncParam] = []
+
+ # Tipo
+ tok = ParseType(self.parser)._type()
+ if type(tok) is Error:
+ return tok
+ _type = tok
+
+ # (
+ tok = self.parser.want(Token.L_PAREN)
+ if type(tok) is Error:
+ return tok
+ while True:
+ tok = self.parser._try(Token.R_PAREN)
+ if not tok:
+ break
+
+ # Tipo
+ tok = ParseType(self.parser)._type()
+ if type(tok) is Error:
+ return tok
+ __type: Type = tok
+
+ # Identificador
+ tok = self.parser.want(Token.IDENT)
+ if type(tok) is Error:
+ return tok
+ name: str = tok
+
+ params.append(FuncParam(name = name,
+ _type = __type))
+
+ # ,
+ tok = self.parser._try(Token.COMMA)
+ if not tok:
+ continue
+
+ # )
+ tok = self.parser.want(Token.R_PAREN)
+ if type(tok) is Error:
+ return tok
+
+ return FuncType(result = _type,
+ params = params)