2016-11-10 87 views
0

我試圖編譯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 

我顯然有一定的生產規則,不知道我在做什麼錯誤。我已經複製了另一個工作示例中的大部分代碼,並根據我的喜好進行了修改。哪裏不對?

回答

0

您的文件不符合UNIX(calculate.l和calculate.y) 如果你在Windows操作系統並使用Nodepad ++,只要做到以下幾點:

  1. 編輯/ EOL轉換/ UNIX格式
  2. 編碼/轉換您的文件爲UTF-8無BOM
  3. 保存並使用Flex編譯和bisonC++

希望這有助於

0

我有同樣的問題,我的老師給我看,有些窗口編輯器在你的文件中創建了不可見的垃圾,所以用終端編輯你的文件。

  • 微微yourfile.y
  • 命中的第一行之前的輸入,比擦除。
  • 保存

那就是它!

+0

是的,我終於明白了。 Notepad ++可以選擇切換到UNIX類型的換行符,這就是我所能做到的。 :) –