bisonC++ - нет правил производства?

Я пытаюсь скомпилировать следующее с bisonC++:

%baseclass-preinclude <iostream>
%lsp-needed

%token NUMBER COMMENT KEYWORD VARIABLE LOGICAND LOGICOR LOGICEQUALS DOUBLELESSER
%token DOUBLEGREATER MOD LESSER GREATER OPEN CLOSE NEGATE CURLYOPEN CURLYCLOSE SEMICOLON

%left EQUALS
%left PLUS MINUS
%left TIMES
%left DIVISION

%%

start:
    expressions
    {
        std::cout << "start -> expressions" << std::endl;
    }
;

expressions:
    // empty
    {
        std::cout << "expressions -> epsylon" << std::endl;
    }
|
    exp expressions
    {
        std::cout << "expressions -> exp expressions" << std::endl;
    }
;

exp:
    NUMBER
    {
        std::cout << "exp -> NUMBER" << std::endl;
    }
|
    COMMENT
    {
        std::cout << "exp -> COMMENT" << std::endl;
    }
|
    exp LOGICAND exp
    {
        std::cout << "exp -> exp LOGICAND exp" << std::endl;
    }
|
    exp LOGICOR exp
    {
        std::cout << "exp -> exp LOGICOR exp" << std::endl;
    }
|
    exp LOGICEQUALS exp
    {
        std::cout << "exp -> exp LOGICEQUALS exp" << std::endl;
    }
|
    exp DOUBLELESSER exp
    {
        std::cout << "exp -> exp DOUBLELESSER exp" << std::endl;
    }
|    
    exp DOUBLEGREATER exp
    {
        std::cout << "exp -> exp DOUBLEGREATER exp" << std::endl;
    }
|
    exp PLUS exp
    {
        std::cout << "exp -> exp PLUS exp" << std::endl;
    }
|
    exp MINUS exp
    {
        std::cout << "exp -> exp MINUS exp" << std::endl;
    }
|
    exp TIMES exp
    {
        std::cout << "exp -> exp EQUAL exp" << std::endl;
    }
|
    exp EQUAL exp
    {
        std::cout << "exp -> exp EQUAL exp" << std::endl;
    }
|
    exp DIVISION exp
    {
        std::cout << "exp -> exp DIVISION exp" << std::endl;
    }
|
    exp MOD exp
    {
        std::cout << "exp -> exp MOD exp" << std::endl;
    }
|
    exp LESSER exp
    {
        std::cout << "exp -> exp LESSER exp" << std::endl;
    }
|    
    exp GREATER exp
    {
        std::cout << "exp -> exp GREATER exp" << std::endl;
    }
|
    OPEN exp CLOSE
    {
        std::cout << "exp -> OPEN exp CLOSE" << std::endl;
    }
|
    NEGATE exp
    {
        std::cout << "exp -> NEGATE exp" << std::endl;
    }
|
    CURLYOPEN exp CURLYCLOSE
    {
        std::cout << "exp -> CURLYOPEN exp CURLYCLOSE" << std::endl;
    }
|
    exp SEMICOLON
    {
        std::cout << "exp -> SEMICOLON" << std::endl;
    }
|
    KEYWORD VARIABLE SEMICOLON
    {
        std::cout << "exp -> KEYWORD VARIABLE SEMICOLON" << std::endl;
    }
;

Тем не менее, он продолжает возвращаться с ошибкой

') encountered.1] Line 1: unrecognized input (`
': identifier or character-constant expected.
[bead.y: fatal] Line 23: No production rules
134950080

У меня, очевидно, есть некоторые правила производства, и я понятия не имею, что я делаю неправильно. Я скопировал большую часть кода из другого рабочего примера и изменил его по своему вкусу. Что случилось?

2 ответа

Решение

Ваши файлы не соответствуют UNIX (Calcu.l и Calculate.y) Если вы работаете в Windows, и вы используете Nodepad ++, просто выполните следующие действия:

  1. Редактировать / преобразование EOL / формат UNIX
  2. Кодирование / Конвертирование ваших файлов в UTF-8 без спецификации
  3. Сохраните и перекомпилируйте с помощью flex и bisonC++

Надеюсь это поможет

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

  • пико yourfile.y
  • Нажмите Enter перед первой строкой, затем удалите ее.
  • Сохранить

Это оно!

Другие вопросы по тегам