пробел в ereg

sollariss

Ситуация такая :
Сканер типа FLEX :
Надо корректно пропускать пробельные символы, вместо этого возвращается конец сканируемого участка ...
т.е.
Выражения типа
" "
[ ]+
ит.д. ит.п. не катят. Хотя по идее должны.

vall

нифига не понял что там у тебя творится.
я всегда просто пустое действие "{ }" ставил на эти правила и всё.
может там по дефолту что-то вроде yymore идёт?

rosali

Если у тебя какое-то другое правило мажорирует это, то оно и отработает. flex жадный, то есть выбирает самый длинный кусок текста подошедший под какое-нибудь правило, а порядок правил не играет роли.

rosali

И кстати что значит "типа FLEX"? lex? Я других типа flex не знаю, какой-нибудь ragel _совсем_ не типа flex-а...

sollariss

типа = вводное слово
Если бы другое правило мажорировало пробел, то все бы отлично работало, мне как раз пустое действие надо, а он, мерзавец, сигнализирует конец ввода по пробельному символу....

kamputer

>а порядок правил не играет роли
Вроде бы всё-таки играет (если совпадение с максимальной длиной достигается на нескольких правилах).

rosali

конец ввода по пробельному символу
Так может этот пробельный символ вовсе не пробел просто?

rosali

Вроде бы всё-таки играет (если совпадение с максимальной длиной достигается на нескольких правилах)
А, ну да конечно. Я просто имел ввиду, что если в конце программы приписать правило .* с умыслом "а если ничего выше не подошло", то результат удивит

sollariss

/t [/t] [[]] - не обнаруживаются вообще! Причем что-то вместо пробела таки находится ... и распознается как конец ввода!

rosali

Ладно давай пость все свои правила целиком, будем разбираться

vall

%{
#include <stdio.h>
%}
%option noyywrap
%%
[a-zA-Z_]+ { printf("got: %s\n", yytext); return 1; }
" "|"\n"|"\t" { }
%%
int main (int argc, char **argv) {
yyin = stdin;
while (yylex;
return 0;
}

кури.

sollariss

Я так делал ... правда не все сразу через | , а по-очереди пробовал, с каждым компилировать - и не работало...
А вот что дает NOYYWRAP ?
Вот мой код
%{
#include "compile.h"
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#ifndef PI_VALUE
#define PI_VALUE 3.14159265358979323846
#endif
#ifndef E_VALUE
#define E_VALUE 2.71828182845904509
#endif
// ЪБЗПМПЧПЛ yylex (УЛБОЙТХАЭЕК ЖХОЛГЙ)
#define YY_DECL int yylex (void * YYLEX_PARAM)
// ФЙР ЬМЕНЕОФПЧ УФЕЛБ РБТУЕТБ
#define YYSTYPE yys
//РБТБНЕФТЩ УЛБОЙТХАЭЕК ЖХОЛГЙЙ (void* ЪБФЕН ВХДЕФ ЛПОЧЕТФЙТПЧБО Ч Tcompargs *
#define YYLEX_PARAM p_compargs
/* ЧПЪЧТБЭБЕНЩЕ ЪОБЮЕОЙС yylex*/
#define Integer 258
#define Double 259
#define Identifier 260
#define Pow 261
#define Sin 262
#define Cos 263
#define Tg 264
#define Ln 265
#define Exp 266
#define Arcsin 267
#define Arccos 268
#define Arctg 269
#define Sqrt 270
#define Hi 271
#define And 272
#define Or 273
#define Not 274
#define Lt 275
#define Le 276
#define Gt 277
#define Ge 278
#define Eqw 279
// ФЙР ЬМЕНЕОФБ УФЕЛБ РБТУЕТБ
typedef struct _yys_
{
int int_value;
double double_value;
} yys ;

// ФЙР БТЗХНЕОФБ УЛБОЕТБ / РБТУЕТБ
typedef struct _Tcompargs_
{
FILE * fp;
PROGR * progr ;
const PROGR_ARG * progr_arg ;
int nargs ;
int cur_position ;
} Tcompargs ;
extern yys yylval ;
%}
INTEGER [0-9]+
DOUBLE [0-9]*"."[0-9]*
IDENTIFIER [a-zA-Z][a-zA-Z_0-9]*
SPACE " "
%%
%{
char c;
int i,nargs;
double d , decimal;
Tcompargs * pcompargs ;
%}
{pcompargs = (Tcompargs*)YYLEX_PARAM;
yyin = pcompargs -> fp ;
nargs = pcompargs -> nargs;
}
{SPACE} {}// {yylval.int_value = (int)' ';printf ("space found \n"); pcompargs -> cur_position ++;return yylval.int_value;}
{DOUBLE} {printf ("found double\n");
d = 0;i=0;
while (isdigit(c=yytext[i++]
{d=10*d+c-'0';}
if (c=='.')
{
decimal = 0.1;
while (isdigit(c=yytext[i++]
{d+=decimal*(c-'0');decimal /=10;}
}
else {printf ("unexpected %c",c);return -2;}
yylval.double_value = d;
printf ("yylval.double = %lf\n",yylval.double_value);
pcompargs -> cur_position += strlen (yytext);
return Double;}

{INTEGER} {printf ("found integer\n");
yylval.int_value = atoi (yytext);
printf ("yylval.int = %d\n",yylval.int_value);
pcompargs -> cur_position += strlen (yytext);
return Integer;}
"^" {yylval.int_value = Pow; printf ("pow found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"sin" {yylval.int_value = Sin; printf ("sin found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"cos" {yylval.int_value = Cos; printf ("cos found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"ln" {yylval.int_value = Ln; printf ("ln found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"arcsin" {yylval.int_value = Arcsin; printf ("arcsin found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"arccos" {yylval.int_value = Arccos; printf ("arccos found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"exp" {yylval.int_value = Exp; printf ("exp found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"tg" {yylval.int_value = Tg; printf ("tg found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"arctg" {yylval.int_value = Arctg; printf ("arctg found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"sqrt" {yylval.int_value = Sqrt; printf ("sqrt found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"&&" {yylval.int_value = And; printf ("and found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"||" {yylval.int_value = Or; printf ("or found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"!" {yylval.int_value = Not; printf ("not found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"<" {yylval.int_value = Lt; printf ("lt found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"<=" {yylval.int_value = Le; printf ("le found \n");pcompargs -> cur_position ++;return yylval.int_value;}
">" {yylval.int_value = Gt; printf ("gt found \n");pcompargs -> cur_position ++;return yylval.int_value;}
">=" {yylval.int_value = Ge; printf ("ge found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"==" {yylval.int_value = Eqw; printf ("== found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"(" {yylval.int_value = (int)'('; printf ("( found \n");pcompargs -> cur_position ++;return yylval.int_value;}
")" {yylval.int_value = (int)')'; printf (") found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"|" {yylval.int_value = (int)'|'; printf ("| found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"+" {yylval.int_value = (int)'+';printf ("+ found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"*" {yylval.int_value = (int)'*';printf ("* found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"-" {yylval.int_value = (int)'-';printf ("- found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"/" {yylval.int_value = (int)'/';printf ("/ found \n");pcompargs -> cur_position ++;return yylval.int_value;}
"e" {yylval.double_value = E_VALUE;pcompargs -> cur_position ++;return Double;}
"pi" {yylval.double_value = PI_VALUE;pcompargs -> cur_position ++;return Double;}
EOF {return -1;}
{IDENTIFIER} {printf ("found identifier\n");
for (i=0;i<nargs;i++)
{
if (!strcmp(pcompargs -> progr_arg[i].name,yytext
{yylval.double_value = *(double*pcompargs -> progr_arg[i].value);
yylval.int_value = i;
break ;
}
}
if (i==nargs) {printf ("unmatched identifier\n"); return -2;}
printf ("yylval.double = %lf\n",yylval.double_value);
pcompargs -> cur_position += strlen (yytext);
return Identifier;}
%%
int yylex (void *);
int yywrap {return 1;}

sollariss

Хм только сейчас посмотрел ... это старый вариант, с тех пор я вставлял [ ]+, [ \t]+, "\t", [[]]+
в определение SPACE

rosali

В примерах к lex-у пишут так:
[ \t\n]+
может проблема именно в \n?
Оставить комментарий
Имя или ник:
Комментарий: