Skip to content

feat (interpreter): postfix increment operator#9

Merged
FdelMazo merged 10 commits intoFdelMazo:mainfrom
AlanValdevenito:feature/postfix-increment-operator
Oct 4, 2025
Merged

feat (interpreter): postfix increment operator#9
FdelMazo merged 10 commits intoFdelMazo:mainfrom
AlanValdevenito:feature/postfix-increment-operator

Conversation

@AlanValdevenito
Copy link
Contributor

Agregado del operador x++ (continuación)

Resumen

Se agrega como interpretar el operador de post-incremento ++ a Plox.

Adicionalmente, se agrega el parseo del operador de pre-incremento ++.

Cambios realizados

Commit bd27671

Siguiendo con la idea propuesta en el PR anterior, se uso el operator como un syntatic sugar de una suma.

Se parseo el operador como una asignación x = x + 1 para modificar el valor de la variable.

Commit f6de721

Comparando como se comportan los operadores de pre-incremento y post-incremento en C

image

me di cuenta que el comportamiento que tenia el operador como syntactic sugar de una suma era como pre-incremento y no como post-incremento:

COMMIT 1

Teniendo en cuenta esto, agregue el parseo del operador de pre-incremento ++ en la regla productiva unary parseandolo como una asignación x = x + 1:

COMMIT 2

Commit a5892c1

Se agrega la resolución de PostfixExpr al Resolver.

Commit 377d0ec

Se agrego como interpretar expresiones de PostfixExpr al Interpreter.

En la implementación primero nos guardamos en una variable el valor viejo, después asignamos el nuevo valor (sumando 1) y devolvemos el valor viejo.

De esta forma el operador se comporta como post-incremento devolviendo el valor viejo y luego incrementando:

image

Ejemplos

Adicionalmente se agregaron ejemplos en increment_operator.lox.

COMMIT 4

Copy link
Owner

@FdelMazo FdelMazo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Muy bueno. Muy interesante que uno puede pasar como syntactic sugar mientras que el otro no (o al menos a mi no se me ocurre como).

Deje unas preguntas, pero esta ok el PR

right = self.unary()

# solo se puede aplicar ++ sobre variables. Si no tenemos una variable, es un error
if not isinstance(right, VariableExpr):
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Casi seguro que no se puede, porque estarías salteando parte de la gramática, pero sabes si hay manera de acá llamar a self.assignment()?

new_value = old_value + 1

# asignamos el nuevo valor
if left in self.local_scope_depths: # si la variable se encuentra en nuestro diccionario de scope local, la asignamos en esa profundidad
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Creo que quedó un poco verboso hacer dos veces el mismo if. ¿que pensas de directamente hacerlo una vez, y en cambio repetir dos veces el + 1? Es un tema de gusto!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahí agregue este cambio profe, pensé en usar funciones lambda para evitar repetir no solo el +1 sino también evitar repetir dos veces el if para chequear que old_value sea un numero.

Si te parece que queda claro con las funciones lambda lo dejo así, sino puedo cambiarlo. Gracias!

@FdelMazo FdelMazo merged commit 968f875 into FdelMazo:main Oct 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants