DU3 - Podivne znaky pred "Everything is OK"

Odeslat odpověď

Smajlíci
:D :) :( :o :shock: :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode je zapnutý
[img] je zapnutý
[flash] je vypnutý
[url] je zapnuté
Smajlíci jsou zapnutí

Přehled tématu
   

Rozšířit náhled Přehled tématu: DU3 - Podivne znaky pred "Everything is OK"

Re: DU3 - Podivne znaky pred "Everything is OK"

od hhhhh » 29. 11. 2010 16:30

jo, pre STR som to riesil presne takto isto... btw uzitocne info ku <<eof>>:
http://flex.sourceforge.net/manual/EOF.html

Re: DU3 - Podivne znaky pred "Everything is OK"

od steves » 29. 11. 2010 16:09

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

Kód: Vybrat vše

{ahoj {svete<<konec souboru>>
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"

od hhhhh » 29. 11. 2010 00:26

podla mna to je velmi stastne riesenie pretoze som to tak riesil uz v druhej ulohe a za 100 bodov :wink:
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"

od fari » 28. 11. 2010 23:30

ee, proc to nejni nejstatstnejsi reseni?

Re: DU3 - Podivne znaky pred "Everything is OK"

od steves » 28. 11. 2010 13:19

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"

od Dusan » 27. 11. 2010 12:41

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

DU3 - Podivne znaky pred "Everything is OK"

od Dusan » 27. 11. 2010 12:04

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?

Nahoru