Pregunta

Me gustaría poder analizar la siguiente estructura:

blah
{
    "string-1",
    "string-2",
    ...,
    "string-n"
}

Estoy usando flex para tokenizar, y eso está funcionando perfectamente. Estoy usando yacc (bison) para el análisis.

¿Cuál es la forma recomendada para permitir esta estructura? En este momento, en mi archivo test.y, tengo:

blah_command:
    BLAH OPEN_BRACE string_list CLOSE_BRACE
    {
        printf( "String list is %s\n", $3 );
    }

string_list: /* empty */
    |
    STRING
    {
        return $1;
    }
    |
    STRING COMMA string_list
    {
        strcat($1, ",");
        strcat($1, $3);
    }

Sospecho que strcat () es una muy, muy mala idea. Soy un verdadero novato cuando se trata de lex / yacc (aproximadamente 3 horas de experiencia), por lo que un golpe en la muñeca y un puntero en la dirección correcta serían geniales.

EDITAR: El objetivo de esto es permitirme construir un arnés de prueba para una aplicación externa. El lexing / parsing se usará para interpretar un script de prueba que proporciona el usuario. Un comando permite al usuario enviar un mensaje a la aplicación, luego leo la respuesta de varias líneas y la comparo con la lista de cadenas de longitud variable que el usuario ha proporcionado en el script. El fragmento que publiqué anteriormente es la forma en que pensé que permitiría al usuario definir la posible respuesta.

Por ejemplo:

blah
{
    "COMMAND EXECUTED CORRECTLY"
}

o

blah
{
    "QUERY COMPLETE IN .0034 SECONDS",
    "1 RECORD FOUND:",
    "FOO=12345",
    "--END OF LIST--"
}
¿Fue útil?

Solución

Si todo lo que está haciendo es imprimir esto, strcat () funciona bien para conectar todas las cadenas juntas.

Normalmente, sin embargo, su analizador construirá un árbol de sintaxis abstracta. Entonces, en lugar de generar la cadena, tendría algo como lo siguiente:

Node* n = new_node(STRING_LIST_NODE); // STRING_LIST_NODE being an enum node type
n->value = $1
n->next = $3
$ = n;

Otros consejos

En su ejemplo, simplemente está enviando la entrada, por lo que strcat está bien.

Normalmente, lo que uno intenta hacer es construir un árbol de sintaxis abstracta. En el caso de un AST, puede crear una estructura de nodo o asignar el contenido a una matriz.

Si da más detalles sobre el objetivo de su programa, puedo darle una respuesta más detallada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top