Ошибка Flex (Lex, не Actionscript или что-то еще) - PullRequest
0 голосов
/ 14 апреля 2010

Я совершенно новичок в сгибании.

Я получаю ошибку сборки при использовании flex. То есть я сгенерировал файл .c, используя flex, и при его запуске получаю эту ошибку:

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

вот файл lex, который я использую (взято из здесь ):

/*** 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;
}

Кроме того, почему я должен поместить функцию main в синтаксический код lex? Я хотел бы иметь возможность вызывать yylex (); из другого файла c.

Ответы [ 2 ]

5 голосов
/ 14 апреля 2010

Ошибка связи Q1

Это выглядит так, как будто что-то не так с функцией isatty (). Он не отображается в коде, который вы показываете, но на него может ссылаться код, сгенерированный flex Если это так, то кажется, что вы компилируете с помощью компилятора C ++, а функция isatty () рассматривается как функция со связью C ++ и не обнаруживается - обычно это функция со связью C и ее необходимо объявить с помощью 'extern "C" int isatty(int);' в коде C ++.

Чтобы решить, отследите, появляется ли isatty() в сгенерированном C. Если это так, также отследите, где он объявлен (стандартный заголовок POSIX для него - <unistd.h>).

Q2 Main

Вам не нужно помещать основную программу в файл с лексером. На самом деле, вы часто этого не делаете, или основная программа там будет просто фиктивной фигурой, используемой для проверки лексера изолированно (и только условно скомпилированной в код - внутри #ifdef TEST / #endif или эквивалентной).

Что заставляет вас думать, что вы должны это сделать?

0 голосов
/ 14 апреля 2010

Ошибка ссылки выглядит так, как будто вы пытаетесь использовать не-родную версию flex для windows, и она не работает должным образом. Если вы используете версию flex, поставляемую с Cygwin, вам необходимо скомпилировать и связать программу с помощью компилятора и компоновщика cygwin.

...