Flex ++ плохая ошибка символа и многое другое. новый, чтобы согнуть - PullRequest
7 голосов
/ 06 ноября 2011

Мы только начинаем использовать flex для создания лексера для проекта, но мы не можем понять, как заставить его работать.Я копирую пример кода, приведенный в руководствах, и пытаюсь запустить flex ++ с tut-файлом в качестве аргумента, однако каждый раз получаю сообщение об ошибке.например,

входной файл (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;
}

с этим кодом я получаю

flex ++ calc.l
calc.l: 1: неверный символ:% calc.l: 1: секция обработки неизвестных ошибок 1
calc.l: 1: секция обработки неизвестных ошибок 1
calc.l: 1: секция обработки неизвестных ошибок 1
calc.l: 2: нераспознанная директива '%'

Может кто-нибудь помочь мне понять, что я здесь делаю неправильно?веселит

Ответы [ 2 ]

3 голосов
/ 14 марта 2013

Вы можете попробовать что-то вроде:

  • , добавив %{ ... %} к первой паре строк в вашем файле
  • , добавив #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 голосов
/ 28 августа 2013

Какую версию flex ++ вы используете? Я использую «Функция: генератор быстрого лексического анализатора C / C ++ V2.3.8-7 (flex ++), основанный на 2.3.8 и модифицированный coetmeur@icdc.fr для c ++» (опция -?), И ваш cacl.c обрабатывается отлично ..

Для Win32 эта версия Flex ++ / Bison ++ имеет вид здесь

...