es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python PLY DATA token value es None.

Estoy tratando de crear un lenguaje de programación en Python utilizando PLY. Al principio fue fácil jugar con el analizador sintáctico porque los tipos de datos eran más simples, pero ahora quiero expandirlo.

Tengo el siguiente código:

def p_show(p):
  '''statement : SHOW LPAREN DATA RPAREN'''
print(p.slice)

def p_data(p):
  '''DATA : INT
          | STRING'''
  p[0] = p[1]

Esperaba que en p.slice el valor de DATA fuera el LexToken debido a p_data. También probé con retornos y más cosas. ¿Cómo puedo cambiar p.slice de:

[statement, LexToken(SHOW,'show',1,0), LexToken(LPAREN,'(',1,4), DATA, LexToken(RPAREN,')',1,10)]

a mostrar el valor en lugar de simplemente DATA, que tiene un valor None.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para cambiar p.slice y mostrar el valor real del token DATA en lugar de simplemente “DATA”, puedes agregar una nueva regla a tu analizador sintáctico que maneje los tokens INT y STRING y establezca sus valores como atributos del objeto de token. Aquí tienes un ejemplo:

    from ply import yacc
    from lexer import tokens
    
    # Define las reglas de la gramática
    def p_statement_show(p):
        'statement : SHOW LPAREN data RPAREN'
        print(p.slice)
    
    def p_data_int(p):
        'data : INT'
        p[0] = p[1]
        p[0].value = int(p[1])
    
    def p_data_string(p):
        'data : STRING'
        p[0] = p[1]
        p[0].value = str(p[1])
    
    # Construye el analizador sintáctico
    parser = yacc.yacc()
    
    # Prueba el analizador sintáctico
    input_str = 'show(42)'
    lexer = lex.lex()
    result = parser.parse(input_str, lexer=lexer)
    

    En este ejemplo, hemos agregado dos nuevas reglas al analizador sintáctico:

    • p_data_int: Esta regla coincide con el token INT y establece su valor como un atributo del objeto de token.
    • p_data_string: Esta regla hace lo mismo con el token STRING.

    Para establecer un atributo del objeto de token en PLY, solo necesitas asignarlo a p[n].attribute. En este caso, estamos estableciendo el atributo value en la representación entera o de cadena del valor del token.

    Con estos cambios, cuando ejecutes el analizador en la entrada show(42), la salida de p.slice para el token DATA ahora mostrará su valor real en lugar de “DATA”:

    [statement, LexToken(SHOW,'show',1,0), LexToken(LPAREN,'(',1,4), LexToken(INT,42,1,5).value=42, LexToken(RPAREN,')',1,7)]
    

Comments are closed.