diff options
author | Iván Ávalos <avalos@disroot.org> | 2022-11-25 12:11:08 -0600 |
---|---|---|
committer | Iván Ávalos <avalos@disroot.org> | 2022-11-25 12:11:08 -0600 |
commit | eb4a3019bc0251e5b2b8229679e3c65d61d55336 (patch) | |
tree | f6b2a89dd35374272bd671933bfe87da4a587215 /compilador/parse/type.py | |
parent | 6b4e9a4e95eb511c194200e38ee323091dc5d7d2 (diff) | |
download | javanol-eb4a3019bc0251e5b2b8229679e3c65d61d55336.tar.gz javanol-eb4a3019bc0251e5b2b8229679e3c65d61d55336.tar.bz2 javanol-eb4a3019bc0251e5b2b8229679e3c65d61d55336.zip |
Buen progreso, pero se cicla
Diffstat (limited to 'compilador/parse/type.py')
-rw-r--r-- | compilador/parse/type.py | 63 |
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) |