Хобрук: Ваш путь к мастерству в программировании

Lex/Yacc: использование глобальных переменных и поиск самого длинного вхождения

Я пытаюсь найти самое длинное слово, состоящее из алфавитов [ghijklpqrswxyz]. Это кажется простой задачей, но, похоже, у меня есть проблемы с пониманием того, как работает lex/yaac. Я тестирую это с файлом linux /usr/share/dict/words, и программа просто возвращает весь список слов вместо того, чтобы печатать самый длинный.

% lex example.l
% cc lex.yy.c -ll
% ./a.out < /usr/share/dict/words

В чем проблема??

%{
char* longest="";
%}

%option noyywrap

%%
^[ghijklpqrswxyz]+$    {if (strlen(yytext)>strlen(longest)) {longest = yytext;}}
.|\n    {;}
%%

int main(void)
{
    yylex();
    printf("The longest matching word: %s\n", longest);
    return 0;
}

Ответы:


1

Значение yytext перезаписывается. Вам нужно будет продублировать и скопировать значение, а не просто присвоить его:

longest = malloc(sizeof(char)*strlen(yytext)); strcpy(longest, yytext);

Имейте в виду, что вы захотите очистить (бесплатно) последовательные значения longest. Но будьте осторожны, чтобы не free использовать статически назначенное значение longest = ""; !

03.03.2014
  • Казалось бы, буфер фиксированного размера (например, char longest[1024];) будет проще и позволит избежать проблем с утечками памяти. Однако вам нужно будет проверить переполнение. 03.03.2014

  • 2

    Эта программа является исправленной версией вашей программы. Он работает точно.

    %option noyywrap
    %{
    char* longest="";
    %}
    %%
    [a-zA-Z]* {if(strlen(yytext)>strlen(longest)) longest = malloc(sizeof(char)*strlen(yytext)); strcpy(longest, yytext);}
    %%
    int main(void)
    {
    yylex();
    printf("The longest matching word: %s\n", longest);
    return 0;
    }
    
    24.06.2015
    Новые материалы

    Как я могу подписаться на тему изображений в ROS Matlab и получить изображение RGB?
    Привет, Пожалуйста, как я могу извлечь изображение из сообщения ROS Image, за которым следует imshow? Я уже подписался на правильную тему, но message.getData() дает мне объект..

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..