Nano Hash - криптовалюты, майнинг, программирование

Большое количество ошибок при компиляции файлов lex и yacc

Я пытаюсь сделать простой калькулятор с помощью yacc/lex, но постоянно получаю большое количество ошибок, многие из которых говорят, что ошибки находятся в сгенерированных файлах.

Я запускаю gcc lex.yy.c y.tab.c -o minicalc и получаю такие ошибки, как

bas.y:34:16: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
 int main(void) {
y.tab.c:499:2: error: expected declaration specifiers before ‘;’ token
 };

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

In file included from lex.yy.c:459:0:
/usr/include/unistd.h: In function ‘yyerror’:
/usr/include/unistd.h:258:22: error: storage class specified for parameter ‘useconds_t’
 typedef __useconds_t useconds_t;
                      ^~~~~~~~~~

из-за этого кажется, что ошибка не в моем коде.

Это мой лексический код:

%{
    #include <stdlib.h>
    #include "y.tab.h"
    void yyerror(char *)
%}

%%

    /* a is value of last expresion */
a   {
        yyval = *yytext - 'a';
        return LAST;
    }

    /* integers */
[0-9]+  {
        yyval = atoi(yytext);
        return INTEGER;
    }

    /* operators */
[-+()=/*\n] { return *yytext; }

    /* skip whitespace */
[ \t]       { ; }

    /* all else is error */
.   yyerror("invalid character");

%%

int yywrap(void) {
    return 1;
}

и это мой код yacc:

%token INTEGER LAST
%left '+' '-'
%left '*' '/'

%{
    void yyerror(char *)
    int yylex(void);
    int lastval;
%}

%%

program:
    program expr '\n'   { lastval = $2; }
    |
    ;

expr:
        INTEGER
    | LAST          { $$ = lastval; }
    | expr '+' expr     { $$ = $1 + $3; }
    | expr '-' expr     { $$ = $1 - $3; }
    | expr '*' expr     { $$ = $1 * $3; }
    | expr '/' expr     { $$ = $1 / $3; }
    | '(' expr ')'      { $$ = $2; }
    ;

%%

void yyerror(char *) {
    fprintf(stderr, "%s\n", s);
}

int main(void) {
    yyparse();
    return 0;
}

Заранее спасибо.

15.04.2019

Ответы:


1

Вам не хватает точки с запятой после void yyerror(char *) как в файле .y, так и в файле .l. Таким образом, компилятор ожидает ; в строках, следующих за ним в сгенерированном коде, что приводит к сообщениям об ошибках, которые вы видите.

15.04.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..