Anfängerproblem mit Lex/Flex

05/11/2011 - 12:25 von Mirko Schroeder | Report spam
Hallo,

ich bin gerade dabei mit dem Scanner Generator flex (Version 2.5.4) zu
experimentieren.

Nach anfànglichen Erfolgen bin ich jetzt fast am verzweifeln und habe
fast eine Nacht experimentiert ohne brauchbares Ergebnis.

Wàre toll, wenn mir jemand helfen könnte.

Ich will einfach in einem C/C++ Quellcode Variablentypen automatisch
àndern, also z.B. 'char' nach 'XXXX'. Und das will einfach nicht klappen:

Hier meine Regeln (sollen nur char nach XXXX àndern):

%%
char[^a-zA-Z0-9] fprintf(yyout, "XXXX");
[^a-zA-Z0-9]?char fprintf(yyout, "XXXX");
ECHO;
. ECHO;
%%

Eingabedatei
character =1;
character =2;
char ch=3;
char t;
char *p;
char *func(char ch);

Ausgabedatei
character =1;
XXXXacter =2;XXXX ch=3;XXXX t;
XXXX *p;XXXX *funcXXXX ch);

Was mir wirklich nicht in den Kopf geht:
- warum wird das 'character' in der ersten Zeile belassen, aber in der
2. Zeile geàndert??
- warum werden Zeilentrenner verschluckt?
 

Lesen sie die antworten

#1 Stefan Reuther
05/11/2011 - 13:50 | Warnen spam
Mirko Schroeder wrote:
Hier meine Regeln (sollen nur char nach XXXX àndern):

%%
char[^a-zA-Z0-9] fprintf(yyout, "XXXX");
[^a-zA-Z0-9]?char fprintf(yyout, "XXXX");
ECHO;
. ECHO;
%%

Eingabedatei
character =1;



Das passt auf keine Regel, wird also erhalten.

character =2;



Hier passt ' char' auf die Regel "[^a-zA-Z0-9]?char", wird also ersetzt.

char ch=3;



Hier passt das 'char' inklusive dem '' von der vorigen Zeile auf
ebendiese Regel. Dadurch wird das Zeilenende "verschluckt".

char t;
char *p;
char *func(char ch);



Hier ebenso. Auch die "(" wird von der Regel verschluckt.

Eigentlich willst du einen Regexp-Parser mit Erkennung von Wortgrenzen.
Wenn ich das richtig sehe, kann flex das nicht direkt (in Perl wàre das
'\bchar\b').

Wahrscheinlich ist es am kleversten, die von flex den Text in "Wort" und
"Nichtwort" zerlegen zu lassen und selbst auf 'char' zu prüfen.
Ungetesteter Hüftschuss:

%%
[a-zA-Z_0-9]+ {
if (strcmp(yytext, "char") == 0) {
fputs("XXXX", yyout);
} else {
fputs(yytext, yyout);
}
}
[^a-zA-Z_0-9] fputs(yytext, yyout);
%%


Stefan

Ähnliche fragen