labandalambda / fg-makam

Implementación de Featherweight Go en makam
1 stars 1 forks source link

Parsear muchas expresiones seguidas #7

Open teofr opened 3 years ago

teofr commented 3 years ago

Actualmente solo podemos "aplicar" a una expresion una accion (select, method call o type assertion), si queremos hacer una cadena de acciones hay que usar parentesis:

# Tenemos:
(w.method(arg)).field
# Queremos:
w.method(arg).field

Como especificacion del problema, tenemos la siguiente pseudo gramatica, donde obviamos varios detalles implementativos:

expr -> <baseexpr> "."<list_sep_plus "." <action>>
          |  <baseexpr>

action -> <goident>                                                          # select
            |   "(" <goident> ")"                                                # type assertion
            |  <goident> "(" <list_sep "," <argument>> ")"     # method call 

baseexpr -> <goident>                                                 # variable
                 |   "(" <expr> ")"
                 |  <goident> "{" <list_sep ";" <field>> "}"    # struct literal

La implementacion en makam puede usar concrete.resolve_conversion para transformar este ast degenerado (una tupla de baseexpr y una lista de action) en uno valido.

cc @brianbok

teofr commented 3 years ago

Ejemplo del resolve_conversion: https://github.com/astampoulis/makam/blob/3836def77b3de0db6c6c222eaaffe5351bdb1c53/examples/tinyml/syntax.makam#L111-L113