2011-11-06 22 views
7

chúng tôi chỉ bắt đầu sử dụng flex để xây dựng một lexer cho một dự án, nhưng chúng tôi không thể tìm ra cách để làm cho nó hoạt động. Tôi sao chép mã ví dụ được đưa ra trong hướng dẫn và cố gắng chạy flex ++ với tệp tut làm đối số của nó tuy nhiên tôi chỉ nhận được một lỗi mỗi lần. ví dụ.Lỗi ký tự lỗi Flex ++ và hơn thế nữa. mới để flex

tập tin đầu vào (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; 
} 

với mã này tôi nhận được

flex ++ calc.l
calc.l: 1: nhân vật xấu:% calc. l: 1: phần xử lý lỗi không xác định 1
calc.l: 1: phần xử lý lỗi không xác định 1
calc.l: 1: process error unknownin g phần 1
calc.l: 2: không được công nhận '%' chỉ thị

ai cũng có thể giúp tôi hiểu những gì đang làm sai ở đây? cổ vũ

+0

bạn có một cách tình cờ có được điều này từ http://www.mario-konrad.ch/index.php?page=20024? Tôi đang gặp vấn đề tương tự mặc dù tôi vừa tải xuống nó lần thứ hai vì vậy tôi sẽ xem xét nó. – Ell

+0

Tôi gặp lỗi tương tự ở đây. – JohnTortugo

+0

Tôi biết đây là một câu hỏi thực sự cũ ... nhưng tôi tìm thấy ít nhất một cách để có được loại tập tin này để biên dịch và chạy nếu bạn cần nó trong tương lai. – summea

Trả lời

3

Bạn có thể thử một cái gì đó như:

  • thêm %{ ... %} để cặp đôi đầu tiên của dòng trong tập tin của bạn
  • thêm #include <iostream>using namespace std;(thay vì cố gắng để xác định Scanner)
  • thêm %option noyywrap phía trên các quy tắc phần
  • chỉ sử dụng yylex()(thay vì cố gắng gọi phương thức của một máy quét không tồn tại)

Với ví dụ của bạn, nó có thể trông giống như thế này:

%{ 
#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

phiên bản của flex là gì ++ bạn sử dụng? Tôi sử dụng 'Chức năng: trình tạo phân tích từ vựng nhanh C/C++ V2.3.8-7 (flex ++), dựa trên 2.3.8 và được sửa đổi bởi [email protected] cho C++' (-? Tùy chọn) và cacl.c của bạn được xử lý một cách hoàn hảo ..

Đối với Win32, phiên bản này của Flex ++/Bison ++ là here