0

我正在尝试使用 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

我显然有一些生产规则,不知道我做错了什么。我从另一个工作示例中复制了大部分代码,并根据自己的喜好对其进行了修改。怎么了?

4

2 回答 2

0

我遇到了同样的问题,我的老师向我展示了一些 Windows 编辑器在您的文件中创建了不可见的垃圾,因此请使用终端编辑您的文件。

  • pico yourfile.y
  • 在第一行之前按 Enter 键,然后将其删除。
  • 节省

而已!

于 2016-11-15T13:51:12.997 回答
0

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

  1. 编辑/EOL 转换/UNIX 格式
  2. 无需 BOM 将文件编码/转换为 UTF-8
  3. 使用 flex 和 bisonc++ 保存并重新编译

希望这可以帮助

于 2017-06-27T19:08:22.883 回答