DU3 - Podivne znaky pred "Everything is OK"

Úvodní kurz překladačů se soustřeďuje zejména na teoretické i praktické základy konstrukce přední části překladače. Součástí předmětu je i cvičení zaměřující se na základy práce s nástroji pro konstrukci překladačů. Po absolvování tohoto kurzu bude posluchač schopen sestrojit vlastní překladač do mezikódu nebo jiného jazyka.
Dusan

DU3 - Podivne znaky pred "Everything is OK"

Příspěvek 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?
Dusan

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

Příspěvek 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
steves
Matfyz(ák|ačka) level I
Příspěvky: 33
Registrován: 13. 12. 2008 16:29
Typ studia: Informatika Bc.

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

Příspěvek 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. :-(
fari

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

Příspěvek od fari »

ee, proc to nejni nejstatstnejsi reseni?
hhhhh

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

Příspěvek od hhhhh »

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();
	[^\{\}
]*	;
}
steves
Matfyz(ák|ačka) level I
Příspěvky: 33
Registrován: 13. 12. 2008 16:29
Typ studia: Informatika Bc.

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

Příspěvek 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

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?
hhhhh

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

Příspěvek od hhhhh »

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

Zpět na „SWI098 Principy překladačů“