2011-11-06 58 views
7

我們剛剛開始使用flex爲項目構建詞法分析器,但我們無法弄清楚如何使其工作。我複製了教程中給出的示例代碼,並嘗試以tut文件作爲其參數運行flex ++,但每次只收到一個錯誤。例如Flex ++錯誤的字符錯誤等等。 flex to new

輸入文件(calc.l)

%name Scanner 
%define IOSTREAM 

DIGIT [0-9] 
DIGIT1 [1-9] 

%% 

"+"    { cout << "operator <" << yytext[0] << ">" << endl; } 
"-"    { cout << "operator <" << yytext[0] << ">" << endl; } 
"="    { cout << "operator <" << yytext[0] << ">" << endl; } 
{DIGIT1}{DIGIT}* { cout << " number <" << yytext << ">" << endl; } 
.     { cout << " UNKNOWN <" << yytext[0] << ">" << endl; } 

%% 

int main(int argc, char ** argv) 
{ 
    Scanner scanner; 
    scanner.yylex(); 
    return 0; 
} 

與此代碼我得到

撓曲++ calc.l
calc.l:1:壞字符:% 計算值。 l:1:未知錯誤處理部分1
calc.l:1:未知錯誤處理部分1
calc.l:1:未知錯誤處理摹節1
calc.l:2:無法識別 '%' 指令

任何人都可以幫助我瞭解什麼即時做錯了什麼?歡呼聲

+0

你有沒有偶然從http://www.mario-konrad.ch/index.php?page=20024得到這個?我有同樣的問題,雖然我只是第二次下載它,所以我會研究它。 – Ell

+0

我在這裏得到同樣的錯誤。 – JohnTortugo

+0

我知道這是一個非常古老的問題......但我發現至少有一種方法可以讓這種類型的文件在未來需要時編譯和運行。 – summea

回答

3

你可以嘗試這樣的:

  • 添加%{ ... %}的第一對夫婦線在你的文件
  • 加入#include <iostream>using namespace std;(而不是試圖定義掃描儀)
  • 加入%option noyywrap規則部分
  • 僅使用yylex()(而不是試圖調用一個不存在的掃描儀的方法)

你的榜樣,它可能是這個樣子:

%{ 
#include <iostream> 
using namespace std; 
%} 

DIGIT [0-9] 
DIGIT1 [1-9] 

/* read only one input file */ 
%option noyywrap 

%% 
"+"    { cout << "operator <" << yytext[0] << ">" << endl; } 
"-"    { cout << "operator <" << yytext[0] << ">" << endl; } 
"="    { cout << "operator <" << yytext[0] << ">" << endl; } 
{DIGIT1}{DIGIT}* { cout << " number <" << yytext << ">" << endl; } 
.     { cout << " UNKNOWN <" << yytext[0] << ">" << endl; } 
%% 

int main(int argc, char** argv) 
{ 
    yylex(); 
    return 0; 
} 
0

什麼是柔性版++你在用嗎? 我使用'函數:快速詞法分析器生成器C/C++ V2.3.8-7(flex ++),基於2.3.8和C++'( - ?option)的[email protected]修改,並且您的cacl.c被處理完美..

對於Win32,這個版本的Flex ++ /野牛++是here