Flex (Lex, не actionscript или что-то еще) Ошибка

Я совершенно новичок во флексе.

Я получаю сообщение об ошибке сборки при использовании 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;
}

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


person Cam    schedule 14.04.2010    source источник


Ответы (2)


Q1 Ошибка ссылки

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

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

Q2 Основной

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

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

person Jonathan Leffler    schedule 14.04.2010
comment
+1 - Спасибо! Я добавил код extern как код C в файл flex, и он отлично работал. Моя единственная другая проблема заключается в следующем: каждый раз, когда я генерирую файл c, в качестве одной из строк включается следующее: #include ‹unistd.h›, и я хочу, чтобы этого не происходило. Любые идеи? - person Cam; 14.04.2010
comment
(больше не могу редактировать) Чтобы ответить на ваш последний вопрос, причина, по которой я говорю, что должен это сделать, заключается в том, что если я попытаюсь вызвать yylex из моего обычного main(), он просто скажет, что функция не может быть найдена. - person Cam; 14.04.2010
comment
@incrediman: это зависит от того, откуда взялся flex ... иногда есть файл шаблона, который flex копирует в свой вывод; иногда содержимое этого файла встроено в flex. Если есть файл, вы можете взломать его - остерегайтесь обновлений. Если файл скомпилирован в двоичный файл flex, вам нужно будет создать свой собственный, или сообщить об ошибке, или скомпилировать flex-код с помощью компилятора C (и затем вы можете связать с компилятором C++, но убедитесь, что вы указали в остальной части вашего кода yylex() имеет связь с C. - person Jonathan Leffler; 14.04.2010
comment
@incrediman: Что касается программных материалов main() - опять же, я думаю, это связь C ++ и C. Я уже намекал на это в предыдущем комментарии. - person Jonathan Leffler; 14.04.2010
comment
@Jnathon Спасибо! Это было действительно полезно! И да (@ваш последний комментарий) - вы правы! Извини за это :) - person Cam; 14.04.2010
comment
@incrediman: вы печатали комментарии в то же время, что и я - бит «уже намекнул» просто означал, что я частично осветил его, но только пока вы печатали свой следующий комментарий / вопрос. - person Jonathan Leffler; 14.04.2010

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

person Chris Dodd    schedule 14.04.2010