aboutsummaryrefslogtreecommitdiff
path: root/compilador/parse
diff options
context:
space:
mode:
Diffstat (limited to 'compilador/parse')
-rw-r--r--compilador/parse/base.py9
-rw-r--r--compilador/parse/decl.py12
-rw-r--r--compilador/parse/expr.py2
-rw-r--r--compilador/parse/type.py38
4 files changed, 27 insertions, 34 deletions
diff --git a/compilador/parse/base.py b/compilador/parse/base.py
index a8f6f8a..49742e6 100644
--- a/compilador/parse/base.py
+++ b/compilador/parse/base.py
@@ -7,12 +7,13 @@ from errors import Error
from typing import NoReturn
from more_itertools import seekable
+from nanoiter import NanoIter
from tabla import TablaLex, Token
from errors import Error
class BaseParser:
- def __init__(self, iterador: seekable):
- self.iterador: seekable = iterador
+ def __init__(self, iterador: NanoIter):
+ self.iterador: NanoIter = iterador
''' Requires the next token to have a matching ltok. Returns that
token, or an error. '''
@@ -49,10 +50,10 @@ class BaseParser:
return tok
def lex(self):
- return next(self.iterador)
+ return self.iterador.next()
def unlex(self):
- self.iterador.seek(-1)
+ self.iterador.back()
''' Returns a syntax error if cond is false and void otherwise '''
def synassert(self, cond: bool, msg: str) -> (Error | NoReturn):
diff --git a/compilador/parse/decl.py b/compilador/parse/decl.py
index 73f8580..4a752f0 100644
--- a/compilador/parse/decl.py
+++ b/compilador/parse/decl.py
@@ -54,7 +54,7 @@ class ParseDecl:
return ident
# Prototipo
- proto = ParseType(self.parser).prototype()
+ proto = ParseType(self.parser).prototype(_type)
if type(proto) is Error:
return proto
@@ -70,12 +70,16 @@ class ParseDecl:
# Parses a declaration.
def decl(self) -> (Decl | Error):
- toks = [Token.BOOLEAN, Token.CHAR, Token.INT, Token.STRING, Token.VOID]
- _next = self.parser.peek(*toks)
+ toks = [Token.BOOLEAN, Token.CHAR, Token.INT, Token.STRING, Token.VOID, Token.FUNCTION]
+ _next = self.parser.want(*toks)
decl: Optional[Decl] = None
- if not _next:
+ if type(_next) is Error:
+ return _next
+ elif _next.tipo is Token.FUNCTION:
+ self.parser.unlex()
decl = self.decl_func()
else:
+ self.parser.unlex()
decl = self.decl_global()
if type(decl) is Error:
diff --git a/compilador/parse/expr.py b/compilador/parse/expr.py
index a00f3d5..23b1a61 100644
--- a/compilador/parse/expr.py
+++ b/compilador/parse/expr.py
@@ -7,6 +7,6 @@ class ParseExpr:
self.parser = parser
def expr(self) -> Expr | Error:
- next(self.parser.iterador)
+ self.parser.iterador.next()
return
diff --git a/compilador/parse/type.py b/compilador/parse/type.py
index 27b83d3..06c68d0 100644
--- a/compilador/parse/type.py
+++ b/compilador/parse/type.py
@@ -16,48 +16,36 @@ class ParseType:
return tok
return BuiltinType(tok.tipo)
- def prototype(self) -> (FuncType | Error):
+ def prototype(self, _type: Type) -> (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
-
+
+ while not self.parser._try(Token.R_PAREN):
+
# Tipo
- tok = ParseType(self.parser)._type()
- if type(tok) is Error:
- return tok
- __type: Type = tok
+ __type = ParseType(self.parser)._type()
+ if type(__type) is Error:
+ return __type
# Identificador
- tok = self.parser.want(Token.IDENT)
- if type(tok) is Error:
- return tok
- name: str = tok
+ name = self.parser.want(Token.IDENT)
+ if type(name) is Error:
+ return name
params.append(FuncParam(name = name,
_type = __type))
# ,
- tok = self.parser._try(Token.COMMA)
- if not tok:
+ if self.parser._try(Token.COMMA):
continue
# )
- tok = self.parser.want(Token.R_PAREN)
- if type(tok) is Error:
- return tok
+ if self.parser._try(Token.R_PAREN):
+ break
return FuncType(result = _type,
params = params)