2016-07-10 2 views
0

Я пытаюсь выполнить компилятор с помощью lex и yacc, но по какой-то причине код не работает на моей машине VM в моем MAC, потому что в нем говорится, что есть некоторые функции отсутствуют в заголовке. Этими функциями являются: islower() и isupper(). ECHO и yylex по какой-либо причине также отсутствуют. Я удалил и установил как bison, так и flex для lex и yacc, но ничего не исправил.функции в missing - islower() и isupper()

Тот же код отлично работает на моей машине VM на компьютере под управлением Windows. Поэтому мой код не проблема. Здесь ошибка error caused with functions missing

+2

Не размещайте фотографии текстовых терминалов. –

+1

Для более легкой части вы просто забыли включить . –

+1

Я включил ctypes, и он говорит: нет такого файла или каталога. это может быть проблемой. как мне это исправить? – Kikadass

ответ

1
  1. islower и isupper найдены в <ctype.h>, а не в <locale.h>. Возможно, что некоторая реализация нестандартно-совместимой библиотеки C предоставляет locale.h, которая также включает в себя ctype.h, но это, конечно же, не относится к стандартной установке C на Mac OS X (или, если на то пошло, Linux).

  2. Вы несете ответственность за свою регистрацию yyerror; вы также должны предоставить точный прототип в любом файле, в котором он вызывается. Он будет автоматически вызываться парсером, генерируемым yacc/bison, но yacc/bison не ставит никаких конкретных требований в прототипе yyerror. Он может возвращать любой тип или ни один, поскольку созданный yacc/bison синтаксический анализатор никогда не использует возвращаемое значение. И это может быть функция varargs, если вы хотите написать версию, которая делает некоторую интерполяцию типа printf. Вам также необходимо объявить его в любом другом профсоюзе, который использует его (как это делает ваш лексер).

  3. yylex не объявляется автоматически грамматикой, генерируемой yacc/bison, хотя она и называется, и ожидается, что она вернет int. С созданным бизоном парсером точные аргументы, представленные yylexyyerror), зависят от множества объявлений бизонов; в частности, если вы укажете, что lexer является реентерабельным, bison предоставит дополнительные аргументы. В простейшем случае (без каких-либо деклараций бизонов), прототип должен быть

    int yylex(void); 
    

    , который соответствует yylex, генерируемому Lex/Flex (опять же, без каких-либо деклараций Реентерабельности).

    В традиционном C декларация выше не требуется, поскольку int является типом возвращаемого по умолчанию для незаявленных функций, а отсутствие аргументов в вызове соответствует отсутствию аргументов в определении. Однако современные компиляторы C (такие как clang, как указано в OS X и/или gcc) предупреждают вас о недостающих прототипах, даже если код будет работать в любом случае. Настоятельно рекомендуется включать четкие заявления, как было упомянуто в bison manual: (раздел 1.9, курсив добавлен)

    прологе могут определять типы и переменные, используемые в действиях. Вы также можете использовать команды препроцессора для определения макросов, используемых там, и использовать #include для включения файлов заголовков, которые выполняют любую из этих операций. Вам необходимо объявить лексический анализатор yylex и принтер ошибок yyerror здесь,, а также любые другие глобальные идентификаторы, используемые действиями в правилах грамматики.

  4. Я не знаю, где вы получаете впечатление, что компилятор жалуется на ECHO, если это не является неуместной каретка; в тексте ошибки четко указано, что проблема связана с yyerror. Каретка находится не в том месте, потому что отображаемая строка является исходной строкой в ​​вашем файле лексического определения, тогда как строка, на которой компилятор C фактически жалуется, - это строка, сгенерированная flex, которая не включает в себя шаблон . и поэтому находится на расстоянии несколько иначе.

    Это слабость в механизме clang для использования карманов, чтобы показать точное местоположение ошибки , но я думаю, вы согласитесь, что в целом гораздо более дружелюбно показать вам исходную исходную строку с его номер соответствующей строки.

Смежные вопросы