• Welcome to TUKE FĂ“RUM - FĂłrum pre študentov Technickej Univerzity v Košiciach.
 

Formálne jazyky a preklada?e

Started by mishelka, 16.09.2010, 13:35:34

« predchádzajúce - ďaląie »

OsamelyVlk

Quote from: ondrej0071 on  16.01.2011, 22:49:19
Quote from: ludko on  16.01.2011, 22:15:11
2.Napíšte, do akej konfigurácie sa dostane automat pri konfigurácii
. a {b | c }, ak na vstup pride znak a


a. {b|c}

toto nie je spravne...ak pride a,tak to bude vyzerat takto,ak sa nemylim

a { . b| . c} .

Hej , lebo tam je cyklus nula az  n krat , takze aj jedno ACKO je vyhovujuci vyraz...

elros

#651
Tie analyzatory zo zotavenim by som ja spravil takto
(btw skusku som uz robil)

Quote from: antil kiprest on  16.01.2011, 20:25:00

A -> X [a Y] {Z}

A(symbolset K){

X(a | HZ | K);  //edit, tu nema byt tiez HY

check(a| HZ | K); //- tu nema byt HY, lebo je to v hranatych zatvorkach druhe, cize ak nebude na vstupe a, tak sa to co tam je v zatvorkach  nevykona cele, cize Y bude hladat zbytocne

if(sym == a ) {
  getsymbol();
  Y(HZ | K);
  //tu check nema dovod byt, toto nieje while cyklus
}

check(HZ | K);
while (sym & (HZ)){
  Z(HZ |K); // v celom cykle while mas mat rovnake parametre, lebo tam moze byt napr viac Zcok za sebou, a bez (HZ) podmienky by ti to kazde Z preskocilo
  check(HZ | K);
}


}

A-> B {d E} (c | F)

void A(symbolset K){

B(d | HE | c | HF | K );
check (d | HE | c | HF | K );

while (sym & (d | HE)){
 if(sym == d)
    getsymbol();
 else
    error(d | HE | c | HF | K);
 
 E(d | HE | c | HF | K);
 check(d | HE | c | HF | K);

}

check(c | HF | K);

  switch(sym){
    case c : getsymbol();
             break;
    case HF: F(K);
             break;
    default: error(K); //tu by som len toto dal, error K, predsa to nie je cyklus, a dalej uz v gramatikenic nieje
 }
}


ludko

Quote from: elros on  16.01.2011, 22:57:45
Tie analyzatory zo zotavenim by som ja spravil takto
(btw skusku som uz robil)


A toto by si ako riesil?


X -> A[B|C] E  dane su aj: H(A),H(B),H(C),H(D)
napsiat syntakticky analyzator s pouzitim fcii error, check.
vysvetlic co su tie H a aky maju vyznam



Mike

#653
X -> A [B|C] D  dane su aj: H(A),H(B),H(C),H(D)
void X (symset K){
   A(H(B)|H(C)|H(D)|K);
   check (H(B)|H(C)|H(D)|K);
   if (sy & (H(B)|H(C)) {
      check (H(B)|H(C)|K);
       switch (sy) {
          case H(B) : B(K);break;
          case H(C) : C(K);break;
          default : error (K);
        }
   }
   D(K);
}

elros


X -> A[B|C] E 

X(symbolset K){

A(HB | HC | HE | K);

check(HB| HC | HE | K);

if(sym in (HB or HC) ) {
   switch(symbol){
      case HB: B(HE| K); break;
      case HC: C(HE| K); break;
      default: error(HE | K);break;
   }
}

E(K);

}



Mike

Definujte gramatiku prikazu do ...while v tvare EBNF a jeho translacnu schemu do jazyka virtualnych instrukcii. Pre navestie pouzite symbol label s prislusnym atributom. Urcte typy pouzitych virtualnych instrukcii jump (pre bezpodmienecny skok) a falsejump (pre podmieneny skok).

kde to najdem v skriptach ?

ondrej0071

Quote from: Mike on  16.01.2011, 23:15:39
Definujte gramatiku prikazu do ...while v tvare EBNF a jeho translacnu schemu do jazyka virtualnych instrukcii. Pre navestie pouzite symbol label s prislusnym atributom. Urcte typy pouzitych virtualnych instrukcii jump (pre bezpodmienecny skok) a falsejump (pre podmieneny skok).

kde to najdem v skriptach ?
Do_While_Stat -> do "{" Stat_Seq "}" while "(" Expr ")"



   T [[ do "{" Stat_Seq "}" while "(" Expr ")"  ]]
   = label<L1> S[[Stat_Seq]] E[[Expr]] falsejump<L2> jump<L1> label<L2>

elros

Quote from: Mike on  16.01.2011, 23:15:39
Definujte gramatiku prikazu do ...while v tvare EBNF a jeho translacnu schemu do jazyka virtualnych instrukcii. Pre navestie pouzite symbol label s prislusnym atributom. Urcte typy pouzitych virtualnych instrukcii jump (pre bezpodmienecny skok) a falsejump (pre podmieneny skok).

kde to najdem v skriptach ?

toto v skriptach nie je,.. ale na skuske byt moze,.. bolo to na prednaske.

Do While [[do Stat_seq while Expr end]] = label<L1> Stat_Seq Expr falsejump<L2>jump<L1>label<L2>

OsamelyVlk

a otazkou ze a,b su typove premenne.Ak a=bxb co bude vyslednym typom ? k comu dochadza pri tejto operacii ?
                                                    Ak a=b co bude vyslednym typom ?  k comu dochadza pri tejto operacii ?


K tomu co napisat ? ze sa deje pri preklade staticka kontrola aby sa zistilo ci je mozne operovat s danymi typmi a aj dynamicka kontrola (pri behu uz programu) aby sa zistilo dynamicky ake typy mozno ocakavat a ukladavat (l-value) do premenej. A aky bude vysledny typ... ved to je individualne "znak kolmice" cize zlyhanie vypoctu...

any idea ?

antil kiprest

Quote from: elros on  16.01.2011, 23:21:56
Quote from: Mike on  16.01.2011, 23:15:39
Definujte gramatiku prikazu do ...while v tvare EBNF a jeho translacnu schemu do jazyka virtualnych instrukcii. Pre navestie pouzite symbol label s prislusnym atributom. Urcte typy pouzitych virtualnych instrukcii jump (pre bezpodmienecny skok) a falsejump (pre podmieneny skok).

kde to najdem v skriptach ?

toto v skriptach nie je,.. ale na skuske byt moze,.. bolo to na prednaske.

Do While [[do Stat_seq while Expr end]] = label<L1> Stat_Seq Expr falsejump<L2>jump<L1>label<L2>

okej a pre while by to bolo  
While [[ while Expr Stat_Seq end ]] = label <L1> Expr falsejump<L2> Stat_Seq jump<L1> label<L2>
???
bravčové krídielka a náhradu sóje poprosím!!

Mike

#660
Quote from: OsamelyVlk on  16.01.2011, 23:36:48
a otazkou ze a,b su typove premenne.Ak a=bxb co bude vyslednym typom ? k comu dochadza pri tejto operacii ?
                                                   Ak a=b co bude vyslednym typom ?  k comu dochadza pri tejto operacii ?

ak A a B su typove premenne, T1 = B1 T2 = B2, potom T1xT2 = T3 a vsetky vyskyty B1 a B2 sa nahradia A, lebo A ma typ TA - tomu sa hovori unifikacia
ak A je typova premenna, T1 = A, T2 = TE (typovy vyraz) kde TE nie je premenna, kazdy vyskyt A sa nahradi TE - substitucia
a to B, ak  T1 = A, T2 = B, potom T1 = B, lebo doslo k substitucii A = B

ondrej0071

Quote from: antil kiprest on  16.01.2011, 23:38:53
Quote from: elros on  16.01.2011, 23:21:56
Quote from: Mike on  16.01.2011, 23:15:39
Definujte gramatiku prikazu do ...while v tvare EBNF a jeho translacnu schemu do jazyka virtualnych instrukcii. Pre navestie pouzite symbol label s prislusnym atributom. Urcte typy pouzitych virtualnych instrukcii jump (pre bezpodmienecny skok) a falsejump (pre podmieneny skok).

kde to najdem v skriptach ?

toto v skriptach nie je,.. ale na skuske byt moze,.. bolo to na prednaske.

Do While [[do Stat_seq while Expr end]] = label<L1> Stat_Seq Expr falsejump<L2>jump<L1>label<L2>

okej a pre while by to bolo  
While [[ while Expr Stat_Seq end ]] = label <L1> Expr falsejump<L2> Stat_Seq jump<L1> label<L2>
???

ano

ludko

3) Upravte bezkontext gramatiku
   A-> abC | a{B} na LL(1). Pre upravenu gramatiku spravit syntakticky analyzator pomocou procedur Check a Error.


?? :)

ondrej0071

Quote from: ludko on  16.01.2011, 23:58:09
3) Upravte bezkontext gramatiku
   A-> abC | a{B} na LL(1). Pre upravenu gramatiku spravit syntakticky analyzator pomocou procedur Check a Error.


?? :)

tak to by aj mna zaujimalo,ako to ma vyzerat  ???

OsamelyVlk

Quote from: ondrej0071 on  17.01.2011, 00:00:17
Quote from: ludko on  16.01.2011, 23:58:09
3) Upravte bezkontext gramatiku
   A-> abC | a{B} na LL(1). Pre upravenu gramatiku spravit syntakticky analyzator pomocou procedur Check a Error.


?? :)

tak to by aj mna zaujimalo,ako to ma vyzerat  ???


no tam sa naraza nato ze to ma byt v EBNF , cize prefixy maju byt vyclenene zlava (aby sa mohlo jednoznacne hned v uvode rozhodnut )
nieco v zmysle a(bC |B{B});
NOT SURE!

antil kiprest

Quote from: OsamelyVlk on  17.01.2011, 00:06:23
Quote from: ondrej0071 on  17.01.2011, 00:00:17
Quote from: ludko on  16.01.2011, 23:58:09
3) Upravte bezkontext gramatiku
   A-> abC | a{B} na LL(1). Pre upravenu gramatiku spravit syntakticky analyzator pomocou procedur Check a Error.


?? :)

tak to by aj mna zaujimalo,ako to ma vyzerat  ???


no tam sa naraza nato ze to ma byt v EBNF , cize prefixy maju byt vyclenene zlava (aby sa mohlo jednoznacne hned v uvode rozhodnut )
nieco v zmysle a(bC |B{B});
NOT SURE!

a v akom jazyku je A-> abC | a{B} ?? to nie je LL(1) ? resp EBNF?  mam v tom trosku zmatok
bravčové krídielka a náhradu sóje poprosím!!

OsamelyVlk

Quote from: antil kiprest on  17.01.2011, 00:11:37
Quote from: OsamelyVlk on  17.01.2011, 00:06:23
Quote from: ondrej0071 on  17.01.2011, 00:00:17
Quote from: ludko on  16.01.2011, 23:58:09
3) Upravte bezkontext gramatiku
   A-> abC | a{B} na LL(1). Pre upravenu gramatiku spravit syntakticky analyzator pomocou procedur Check a Error.


?? :)

tak to by aj mna zaujimalo,ako to ma vyzerat  ???


no tam sa naraza nato ze to ma byt v EBNF , cize prefixy maju byt vyclenene zlava (aby sa mohlo jednoznacne hned v uvode rozhodnut )
nieco v zmysle a(bC |B{B});
NOT SURE!

a v akom jazyku je A-> abC | a{B} ?? to nie je LL(1) ? resp EBNF?  mam v tom trosku zmatok


podla mna A-> abC | a{B} je v BNF jazyk LR(k) . LL(1) jazyk je pri rozsirenej BNF== EBNF.
EBNF je vlastne rozsirena BNF , preto pre obidva typy malujeme prechodovy diagram.
LL(1) je vsak jazyk ktory parsuje (nacitava symboly) zlava , preto musi byt v najlavejsom vyraze hned definovany prefix .
LL(1) je zalozeny na konstrukcii najlavejsieho odvodenia , preto nesmie mat rovnake vyrazy v dvoch vetvach
laicky by som povedal ze v EBNF len upravujes na krajsiu formu , nieco ako ked mas v matike vyberanie pred zatvorky...



antil kiprest

Quote from: OsamelyVlk on  17.01.2011, 00:23:24
Quote from: antil kiprest on  17.01.2011, 00:11:37
Quote from: OsamelyVlk on  17.01.2011, 00:06:23
Quote from: ondrej0071 on  17.01.2011, 00:00:17
Quote from: ludko on  16.01.2011, 23:58:09
3) Upravte bezkontext gramatiku
   A-> abC | a{B} na LL(1). Pre upravenu gramatiku spravit syntakticky analyzator pomocou procedur Check a Error.


?? :)

tak to by aj mna zaujimalo,ako to ma vyzerat  ???


no tam sa naraza nato ze to ma byt v EBNF , cize prefixy maju byt vyclenene zlava (aby sa mohlo jednoznacne hned v uvode rozhodnut )
nieco v zmysle a(bC |B{B});
NOT SURE!

a v akom jazyku je A-> abC | a{B} ?? to nie je LL(1) ? resp EBNF?  mam v tom trosku zmatok


podla mna A-> abC | a{B} je v BNF jazyk LR(k) . LL(1) jazyk je pri rozsirenej BNF== EBNF.
EBNF je vlastne rozsirena BNF , preto pre obidva typy malujeme prechodovy diagram.
LL(1) je vsak jazyk ktory parsuje (nacitava symboly) zlava , preto musi byt v najlavejsom vyraze hned definovany prefix .
LL(1) je zalozeny na konstrukcii najlavejsieho odvodenia , preto nesmie mat rovnake vyrazy v dvoch vetvach
laicky by som povedal ze v EBNF len upravujes na krajsiu formu , nieco ako ked mas v matike vyberanie pred zatvorky...





aha aha takze ide o to ze ked zadam prve 'a' tak este stale neviem ci idem vetvou abC alebo a{B}  spravne??? 

ale s tou BNF Ta musim opravit... toto urcite nie je v BNF.. ta totiz nepodporuje  {}  ..preto sa pytam aky jazyk to je
bravčové krídielka a náhradu sóje poprosím!!

antil kiprest

Quote from: ondrej0071 on  16.01.2011, 23:54:02
Quote from: antil kiprest on  16.01.2011, 23:38:53
Quote from: elros on  16.01.2011, 23:21:56
Quote from: Mike on  16.01.2011, 23:15:39
Definujte gramatiku prikazu do ...while v tvare EBNF a jeho translacnu schemu do jazyka virtualnych instrukcii. Pre navestie pouzite symbol label s prislusnym atributom. Urcte typy pouzitych virtualnych instrukcii jump (pre bezpodmienecny skok) a falsejump (pre podmieneny skok).

kde to najdem v skriptach ?

toto v skriptach nie je,.. ale na skuske byt moze,.. bolo to na prednaske.

Do While [[do Stat_seq while Expr end]] = label<L1> Stat_Seq Expr falsejump<L2>jump<L1>label<L2>

okej a pre while by to bolo  
While [[ while Expr Stat_Seq end ]] = label <L1> Expr falsejump<L2> Stat_Seq jump<L1> label<L2>
???

ano

oks, a k comu sa viaze to end ??
bravčové krídielka a náhradu sóje poprosím!!

elros

to end je len slovko,.. teda ze koniec napr v jazyku pascal,.. v cecku je to ta vlnita zatvorka,.. ked chces ten label l2 je vlastne ten koniec.

a ta gramatika prepisana bude:  a(bC |{B}) ,... to mas akokeby si a vybral pred zatvorky, lebo v LL1 gramatike v jednom riadku nema byt dvakrat ten isty terminalny symbol.

antil kiprest

Quote from: elros on  17.01.2011, 00:32:15
to end je len slovko,.. teda ze koniec napr v jazyku pascal,.. v cecku je to ta vlnita zatvorka,.. ked chces ten label l2 je vlastne ten koniec.

a ta gramatika prepisana bude:  a(bC |{B}) ,... to mas akokeby si a vybral pred zatvorky, lebo v LL1 gramatike v jednom riadku nema byt dvakrat ten isty terminalny symbol.

no jasne, to B navyse som si nevsimol..  a nevies aky je to teda jazyk?? myslim A-> abC | a{B}   ...typujem ze je kontextovy, alebo to je nieco ine?
bravčové krídielka a náhradu sóje poprosím!!

OsamelyVlk

Quote from: antil kiprest on  17.01.2011, 00:35:44
Quote from: elros on  17.01.2011, 00:32:15
to end je len slovko,.. teda ze koniec napr v jazyku pascal,.. v cecku je to ta vlnita zatvorka,.. ked chces ten label l2 je vlastne ten koniec.

a ta gramatika prepisana bude:  a(bC |{B}) ,... to mas akokeby si a vybral pred zatvorky, lebo v LL1 gramatike v jednom riadku nema byt dvakrat ten isty terminalny symbol.

no jasne, to B navyse som si nevsimol..  a nevies aky je to teda jazyk?? myslim A-> abC | a{B}   ...typujem ze je kontextovy, alebo to je nieco ine?

JJ B som tam videl 2x , @erlos mas pravdu.

elros

asi to bude nejaky LL(k) jazyk,..

Mike

takze ak napriklad mam   A->aBCdeF|aBCd, vieme ze to nie je gramatika LL(1) lebo v jednom riadku nemoze byt viac krat ten isty terminalny symbol

do LL(1) vyberiem pred zatvorku aBCd a vyjde mi co ...

A-> aBCd ( eF| ? )

antil kiprest

4. Napíšte prefixnú a postfixnú formu výrazu a+b+c*d+e/f pre gramatiku z príkladu 3

+ a – asociujĂş do prava, * neasociuje  a / dolava a priorita je takáto:
  p(+)= p(-) > p(*) > p(/)


postfix by mal byt :  ab+c+de+*f/

a prefix??

bravčové krídielka a náhradu sóje poprosím!!