bisonc ++ - 没有生产规则?

时间:2016-11-10 12:36:19

标签: 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 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我的老师告诉我,有些Windows编辑器会在您的文件中创建隐形垃圾,因此请使用终端编辑您的文件。

  • pico yourfile.y
  • 在第一行之前按Enter键,而不是删除它。
  • 保存

多数民众赞成!

答案 1 :(得分:0)

您的文件不符合UNIX(calculate.l和calculate.y) 如果您在Windows上运行并使用Nodepad ++,请执行以下操作:

  1. 编辑/ EOL转换/ UNIX格式
  2. 将您的文件编码/转换为没有BOM的UTF-8
  3. 使用flex和bisonc ++保存并重新编译
  4. 希望这有帮助