Stránka 1 z 1
DU3 - Podivne znaky pred "Everything is OK"
Napsal: 27. 11. 2010 12:04
od Dusan
Ahoj,
pri prekladu nekterych programu mi mlc.exe misto "Everything is OK" vypisuje "EEEverything is OK" nebo "<><>Everything is OK" atp. Procital jsem forum z roku 2006 a nekdo tam resil stejny problem. Prisel na to, ze to zpusobuje FLEX pri <<EOF>>, ale moc moudry z toho prispevku nejsem.
Nemate nekdo stejny problem? Neprisel jste uz nekdo na to, jak jej vyresit?
Diky Dusan
Jeste jedna vec: pri prekladu mi VS2008 hlasi v souborech du3g.cpp a du3l.cpp 12 warningu. Nevite jak je to s jejich hodnocenim, jestli se za ne strhavaji body nebo ne?
Re: DU3 - Podivne znaky pred "Everything is OK"
Napsal: 27. 11. 2010 12:41
od Dusan
Tak uz jsem nejspise identifikoval cast .lexu, ktera zpusobuje ten podivny vypis.
Vsiml jsem si, ze se znaky vypisuji napriklad pokud se v souboru nachazi komentar tvaru {<<<}. Pohledem do odpovidajici casti meho souboru .lex jsem zjistil, ze uplne na konci casti pro komentare jsem mel odchyt tela komentare ve tvaru [^
\{\}<<EOF>>]+ s prazdnou akci. Stejne tak u retezcu jsem mel pravidlo [^\'
<<EOF>>]+ s akci str += yytext;.
Kdyz jsem z vyrazu odstranil <<EOF>> tak se mi uz "Everything is OK" vypisuje v poradku. Rikam si ale, jestli jsem si tim nezavlekl do lexu chybu, jestli mi vyraz bez <<EOF>> nemuze namatchovat i EOF (ale asi ne, nebot pri neuzavrenem retezci na konci souboru dostavam chybu "EOF in string").
Dusan
Re: DU3 - Podivne znaky pred "Everything is OK"
Napsal: 28. 11. 2010 13:19
od steves
I mně tenhle problém potkal. Vygooglil jsem tenhle dokument -
http://flex.sourceforge.net/manual/EOF.html, kde se píše
<<EOF>> rules may not be used with other patterns
Na základě toho se domnívám, že v pravidlech typu [^<<EOF>>
\{\}] ve skutečnosti flex to "<<EOF>>" nevnímá jako speciální znak, ale prostě jako znaky '<', '<', 'E', 'O', 'F', '>', '>', takže tím člověk akorát zakáže tyhle znaky v comments/strings.
Jednoduchý workaround by mohlo být udělat to "dřevně" a na každý krok matchovat pouze jeden znak a tím pádem se vyhnout potřebě matchovat negaci <<EOF>>.
Kód: Vybrat vše
<COMMENT>{
<<EOF>> error(DUERR_EOFINCMT, lineNum); yyterminate();
lineNum++;
\{ commentLevel++;
\} if (--commentLevel == 0) BEGIN(INITIAL);
.
}
Tohle funguje, nicméně cvičící nás upozorňoval, že to samozřejmě není zrovna nejšťastnější řešení... Možná to nevidím, ale přijde mi, že pokud <<EOF>> mohu použít jenom samostatně, tak to prostě ale jinak než takhle-znak po znaku-nepůjde? Další věc je, že určitě ve flexu verze xy to funguje takhle, ve verzi xz zase jinak a nejlíp se stejné verze budou svým chováním lišit na win a linuxu.
Re: DU3 - Podivne znaky pred "Everything is OK"
Napsal: 28. 11. 2010 23:30
od fari
ee, proc to nejni nejstatstnejsi reseni?
Re: DU3 - Podivne znaky pred "Everything is OK"
Napsal: 29. 11. 2010 00:26
od hhhhh
podla mna to je velmi stastne riesenie pretoze som to tak riesil uz v druhej ulohe a za 100 bodov
teda aby som bol uplne presny tu je moj blok CMT:
Kód: Vybrat vše
<CMT>{
++line;
"{" ++nOfCmt;
"}" if (!--nOfCmt) BEGIN(INITIAL);
<<EOF>> error(DUERR_EOFINCMT, line); yyterminate();
[^\{\}
]* ;
}
Re: DU3 - Podivne znaky pred "Everything is OK"
Napsal: 29. 11. 2010 16:09
od steves
fari píše:ee, proc to nejni nejstatstnejsi reseni?
protože se tam matchuje znak po znaku, oproti tomu např. v řešení od "hhhhh" to namatchuje všechny znaky uvnitř komentáře najednou. (ta hvězdička místo tečky v posledním pravidlu je to, oč tu běží)
Podle všeho flex konec souboru nezpracovává standardně jako ostatní znaky, ale pokud na něj narazí, tak prostě zavolá pravidlo s <<EOF>>, i když by ten konec souboru matchoval do jiného pravidla. Například, když vezmu řešení od "hhhhh", tak zpracování vstupu
by mělo vypadat tak, že to najde první složenou závorku, pak namatchuje "ahoj " (vyraz [^\{\}
]*), pak další složenou závorku a pak by měl (zase přes výraz [^\{\}
]*) namatchovat "svete<<konec souboru>>", ale když narazí na konec souboru, tak asi vždy zavolá pravidlo s <<EOF>>, takže <<EOF>> vlastně není něco jako zástupný znak v regexpu, ale spešl pravidlo, co se zavolá vždy, když flex narazí na konec souboru.
hhhhh píše:
som to tak riesil uz v druhej ulohe a za 100 bodov
Paráda v tom případě by to na jejich testovacím prostředí mělo takhle fungovat. Řešil jsi podobně i stringy?
Re: DU3 - Podivne znaky pred "Everything is OK"
Napsal: 29. 11. 2010 16:30
od hhhhh
jo, pre STR som to riesil presne takto isto... btw uzitocne info ku <<eof>>:
http://flex.sourceforge.net/manual/EOF.html