0 votes

Flex (Lex, pas actionscript ou autre) Erreur

Je suis totalement novice en matière de flex.

J'obtiens une erreur de construction lors de l'utilisation de flex. C'est-à-dire que j'ai généré un fichier .c à l'aide de flex, et lorsque je l'exécute, j'obtiens cette erreur :

1>lextest.obj : error LNK2001: unresolved external symbol "int __cdecl isatty(int)" (?isatty@@YAHH@Z)
1>C:\...\lextest.exe : fatal error LNK1120: 1 unresolved externals

Voici le fichier lex que j'utilise (extrait de aquí ):

/*** Definition section ***/

%{
/* C code to be copied verbatim */
#include <stdio.h>
%}

/* This tells flex to read only one input file */
%option noyywrap

%%
    /*** Rules section ***/

    /* [0-9]+ matches a string of one or more digits */
[0-9]+  {
            /* yytext is a string containing the matched text. */
            printf("Saw an integer: %s\n", yytext);
        }

.       {   /* Ignore all other characters. */   }

%%
/*** C Code section ***/

int main(void)
{
    /* Call the lexer, then quit. */
    yylex();
    return 0;
}

De même, pourquoi dois-je placer une fonction "main" dans le code de syntaxe lex ? Ce que je voudrais, c'est pouvoir appeler yylex() ; à partir d'un autre fichier c.

4voto

Jonathan Leffler Points 299946

Q1 Erreur de liaison

Il semble que la fonction isatty() ne soit pas claire. Elle n'apparaît pas dans le code que vous montrez - mais elle pourrait être référencée dans le code généré par flex. Si c'est le cas, il semble que vous compilez avec un compilateur C++, et que la fonction isatty() est traitée comme une fonction avec un lien C++ et n'est pas trouvée - c'est normalement une fonction avec un lien C et devrait être déclarée avec ' extern "C" int isatty(int); dans le code C++.

Pour résoudre ce problème, il faut déterminer si isatty() apparaît dans le C généré. Si c'est le cas, recherchez également l'endroit où elle est déclarée (l'en-tête standard POSIX pour elle est <unistd.h> ).

T2 Principal

Il n'est pas nécessaire de placer le programme principal dans le fichier contenant le lexateur. En effet, vous ne le ferez souvent pas, ou alors le programme principal sera simplement un leurre utilisé pour tester le lexateur de manière isolée (et seulement compilé dans le code de manière conditionnelle - à l'intérieur de #ifdef TEST / #endif ou équivalent).

Qu'est-ce qui vous fait penser que vous devez le faire ?

-1voto

Chris Dodd Points 39013

L'erreur de lien semble indiquer que vous essayez d'utiliser une version non native de flex sous Windows, et qu'elle ne fonctionne pas correctement. Si vous utilisez la version de flex livrée avec cygwin, vous devez compiler et lier le programme avec le compilateur et l'éditeur de liens de cygwin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X