• 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

« predchdzajce - alie »

ursus

#200
Quote from: Makaveli on  04.11.2010, 15:52:21
ohladom toho zadania c.2 to treba aby to aj nakoniec ten program vypocital,?:D ci ma to len vypisat to co som pouzil :D asi nie co???
napisat si gramatiku musis,  a to nakodit, to su tie funkcie expr, term, to ti treba doplnit, upravit, pridat mozno nejaku novu a tak :ropebanana:
So this router walks into the doctor's office...
- Doctor, it hurts when IP.

Shwollo

int term()
{ int value;
switch (symbol)
{
case LPAR : getsymbol(); value = expr(); getsymbol(); break;
case VALUE: value = attr; getsymbol(); break;
}
return value;
}



int expr()
{ int leftOp, rightOp; SymType sy;
leftOp = term();
while ((E symbol) & (E NASOBENIE | E DELENIE))
{
sy = symbol; getsymbol(); rightOp = term();
switch (sy)
{
case NASOBENIE :  leftOp = leftOp * rightOp ; break;
case DELENIE:  leftOp = leftOp / rightOp ; break;
}
}
return leftOp;
}


skúste mi niekto vysvetliť, čo robia tieto funkcie pls
nepíšte mi SS - radšej mi píšte mail. (tá obálka pod mojim avatarom :)))

baf62

Quote from: ursus on  04.11.2010, 04:20:54
pridaj, za tolko sa mi nechce ani konkurovat  ;D
:) a za kolko by si to chcel robit? podla mna to je primerana cena...

fail

zdravim...
ak mam zadanie s true a false tak k symbols si mam pridat este FALSE a TRUE, alebo ich mam brat ako VALUE(s tym, ze value nebude brat cisla) ?

mishelka

#204
Quote from: fail on  05.11.2010, 15:44:29
zdravim...
ak mam zadanie s true a false tak k symbols si mam pridat este FALSE a TRUE, alebo ich mam brat ako VALUE(s tym, ze value nebude brat cisla) ?

Boolovske hodnoty reprezentujte ako symbol BOOLVALUE s ciselnou vnutornou reprezentaciou atributov (cize napr. true == 1 a false == 0).. Cize v programe to budete mat reprezentovane ako:

BOOLVALUE<0>
BOOLVALUE<1>

Pricom to bude na vstupe brat v textovej podobe "true" a "false". Cize na vstupe zadam napr.:

true && false || true && (false || true)

Pri vypise vysledku tiez bude "true" alebo "false" a pri vypisoch tiez budu v tych zatvorkach atributovych "true" a "false", nie 1 a 0. Cize vypisy budu:

BOOLVALUE<true>
BOOLVALUE<false>

Vysledok je true.
Vysledok je false.
  

#define TRUE FALSE //Happy debugging suckers :D

profesionale

Co vlastne treba robit na tom zadani? Co tam doprogramovat alebo co??? Lebo ja tomu zadaniu zadania akosi nechapem.

nF

tiez hladam niekoho kto by mi k tomu napisal aspon par milych slov ze oco v tom zadani ide... nebol som na jednom cviku a teraz som z toho uplne vymlety... zadanie 2, operator * asociativita s Xkom pri dolava a prioritou 1, operator / asoc. s Xkom pri doprava a prioritou 2...
Vyzera to na nejaku kalkulacku ale asi to take lahke nebude. nakodim si to sam samozrejme len neviem s cim a kde zacat.
Odmena za dobru radu bude pivecko...

ursus

sak si napis gramatiku more, napapier normalne
So this router walks into the doctor's office...
- Doctor, it hurts when IP.

azzazeL

nazdar tak dnes som sa pozrel do toho 2 zadania a neviem co to tam presne chcu, ci program pre lex. analyzu kde bude lex. analyzator, syntaktycky analyzator, semantycky analyzator.
A ci cakaju aj daky vystup v takej podobe ze sa vyhodnoti boolovsky vyraz, lebo v zdrojaku co je zavesy na nete sa len rozanalyzuje retazec znakov, ci  symboli ktore su v nom patria do jazyka.


#include <stdio.h>
//#include <conio.h>
#include <ctype.h>

#define SetType unsigned long int

#define SymType int

// Typy symbolov a mnozin symbolov

// definicia symbolov VALUE, PLUS, MINUS, atd.
enum Symbols { VALUE, PLUS, MINUS, LPAR, RPAR, SEOF, SERROR };

SetType SymbolSet = 0;
// Nastavenie SymbolSet na prazdnu mnozinu

// Vstupne premenne
char sourceString[100]; // - vstupny retazec
char c; int ic; // vstupny znak a index do vstupneho retazca

// Vystupny symbol lexikalnej analyzy, jeho kod a atribut
SymType symbol; int code, attr;

// Lexikalny analyzator
void getsymbol()
{
c=sourceString[ic]; ic=ic+1;
while (c == ' ') { c=sourceString[ic]; ic=ic+1; }
switch (c)
{
case '+' : symbol = PLUS;  break;
                case '-' : symbol = MINUS; break;
case '(' : symbol = LPAR;  break;
case ')' : symbol = RPAR;  break;
case '\0': symbol = SEOF;   break;
default  : if (c >='0' && c <= '9')
   {
   symbol = VALUE; attr = 0;
   while (c >= '0' && c <= '9')
   {
attr = attr*10 + (int) c - (int) '0';
c=sourceString[ic]; ic=ic+1;
   }  ic=ic-1;
   } else {
symbol = SERROR;
   }
}
}

int main(int argc, char* argv[])
{ char tc; int i;
   printf("\nSeparatna lexikalna analyza a interpretator vyrazov\n");
printf("\nKody symbolov: VALUE=0, PLUS=1, MINUS=2, LPAR=3, RPAR=4, SEOF=5, SERROR=6");
printf("\n-------------------------------------------------------------------------\n\n");

printf("Vstupny vyraz (retazec znakov): ");
// Citanie vstupneho retazca
for (i = 0; (i < 100) && ((c = getchar()) != '\n'); i++)
   {
       sourceString[i] = c;
   }
// Ukoncenie retazca znakom `\0`
   sourceString[i] = '\0';
//
ic=0; // nastavenie na 1. znak
   printf("\nTest lexikalnej analyzy ------------> \n");
printf( "\nVystup lexikalnej analyzy (retazec symbolov)\n\n", sourceString);
do {
getsymbol();
printf("[%d] ",symbol);
if (symbol==VALUE) printf("<%d> ",attr);
tc=getchar(); printf("\n");
} while (symbol != SEOF);

printf("\n<------------Koniec testu lexikalnej analyzy a obnova vstupu\n"); tc=getchar();
}


alebo ci staci do tohto programu doplnit operandy ktore mame v zadani a prerobyt asociaciu ak mame z prava do lava alebo bez asociacie

ursus

stiahni si to z kolarovej stranky, tam budes mat aj funkcie naviac ktroe robia semanticku analyzu, hej musis opravot operatory a tie funkcie tak aby robili asoc a prior. taku aku ces
So this router walks into the doctor's office...
- Doctor, it hurts when IP.

Shwollo

napr: vytvorte gramatiku pre aritmeticke vyrazy pouzivajuce operacie:
   +,-, asociativne zlava s prioritou 1
   *,/, asociativne sprava s prioritou 2


ako bude vyzerať odpoveď na toto?
nepíšte mi SS - radšej mi píšte mail. (tá obálka pod mojim avatarom :)))

ursus

doprdele, predam zadania za 6€  ;D
So this router walks into the doctor's office...
- Doctor, it hurts when IP.

Safyia

ma byt po odovzdavani zadani aj pisomka?? A co ma na nej byt? Lebo my sme nejak mali k tomuto druhemu zadaniu na cviku vzdy niekoho ineho...

Shwollo

nepíšte mi SS - radšej mi píšte mail. (tá obálka pod mojim avatarom :)))

HejaHop

moze mi niekto povedat co znamena ak mam pri oparatore / zadane "bez asociacie" ...viem že ked je asociacia do lava tak sa retazec napr. 2*4*5*2 vyhodnoti nejak takto (((2*4)*5)*2) pri asociacii do prava takto (2*(4*(5*2))).... no a ako sa ma vyhodnotit takyto retazec bez asociacie.... malo by to byt nejak bez tych zatvoriek ale ako?

fail

Quote from: HejaHop on  06.11.2010, 23:25:32
moze mi niekto povedat co znamena ak mam pri oparatore / zadane "bez asociacie" ...viem že ked je asociacia do lava tak sa retazec napr. 2*4*5*2 vyhodnoti nejak takto (((2*4)*5)*2) pri asociacii do prava takto (2*(4*(5*2))).... no a ako sa ma vyhodnotit takyto retazec bez asociacie.... malo by to byt nejak bez tych zatvoriek ale ako?
nie je to nahodou naopak s tou asociativitou ?

ursus

omg ja mam normalne problem vymyslet priklad s && a || aby som dokazal ze mam asociativitu && dolava, resp priorita || je vyssia ako &&

halp !? ;D
So this router walks into the doctor's office...
- Doctor, it hurts when IP.

elros

Quote from: ursus on  07.11.2010, 05:50:38
resp priorita || je vyssia ako &&

skus true || false && false 
Ked je || vyssia priorita ako && tak vysledok bude false, a ked bude nizsia malo by to byt true

fail

kamarat sa pyta:
Quote10*10/2*5/5 ak je delenie neasociativne (a nasobenie je zlava).. vysledok ma byt 2 alebo 10? diky

fail


fail

a vyuzijem prilezitost, ze ste tu....
pytal som sa uz viacerych a kazdy mi povedal inak... kamarat ma u ineho cviciaceho asociativnost zlava a zprava... logicky zlava = doprava ... povedal,ze zlava je jednoznacne ((1*2)*3) ... ale na predoslej strane niekto napisal, ze doprava je (1*(2*3)).. tak ako to je prosim Vas ?

profesionale

Moje zadanie


* - Do lava -priorita 2   
/ - Do prava - priorita 1

Mozem poprosit o kontrolu ci je to takto spravne. Dakujem

// Interpretator vyrazov s gramatikou
// Expr -> Term { ( <*> | </> ) Term }
// Term -> <Value> | <(> Expr <)>
//
// Pozn: Terminalne symboly su v zatvorkach < >

int expr();



int term()
{ int value;
switch (symbol)
{
case LPAR : getsymbol(); value = expr(); getsymbol(); break;
case VALUE: value = attr; getsymbol(); break;
}
return value;
}

int expr()
{ int leftOp, rightOp; SymType sy;
leftOp = term();
while ((E symbol) & (E DELENIE | E NASOBENIE))
{
sy = symbol; getsymbol(); rightOp = term();
switch (sy)
{
case DELENIE :  leftOp = leftOp / rightOp ; break;
case NASOBENIE:  leftOp = rightOp * leftOp ; break;
}
}
return leftOp;
}

Shwollo

ľavá asociativita znamená asiciativita zľava alebo doľava?
nepíšte mi SS - radšej mi píšte mail. (tá obálka pod mojim avatarom :)))

ursus

Quote from: profesionale on  07.11.2010, 18:54:48
Moje zadanie


* - Do lava -priorita 2   
/ - Do prava - priorita 1

Mozem poprosit o kontrolu ci je to takto spravne. Dakujem

// Interpretator vyrazov s gramatikou
// Expr -> Term { ( <*> | </> ) Term }
// Term -> <Value> | <(> Expr <)>
//
// Pozn: Terminalne symboly su v zatvorkach < >

int expr();



int term()
{ int value;
switch (symbol)
{
case LPAR : getsymbol(); value = expr(); getsymbol(); break;
case VALUE: value = attr; getsymbol(); break;
}
return value;
}

int expr()
{ int leftOp, rightOp; SymType sy;
leftOp = term();
while ((E symbol) & (E DELENIE | E NASOBENIE))
{
sy = symbol; getsymbol(); rightOp = term();
switch (sy)
{
case DELENIE :  leftOp = leftOp / rightOp ; break;
case NASOBENIE:  leftOp = rightOp * leftOp ; break;
}
}
return leftOp;
}


asociativity som nekukal, ale uz len z toho ze mas rozdielne priority nemozes mat obe operatory v jednej funkcii,
So this router walks into the doctor's office...
- Doctor, it hurts when IP.

profesionale

Quote from: ursus on  07.11.2010, 22:43:49
Quote from: profesionale on  07.11.2010, 18:54:48
Moje zadanie


* - Do lava -priorita 2   
/ - Do prava - priorita 1

Mozem poprosit o kontrolu ci je to takto spravne. Dakujem

// Interpretator vyrazov s gramatikou
// Expr -> Term { ( <*> | </> ) Term }
// Term -> <Value> | <(> Expr <)>
//
// Pozn: Terminalne symboly su v zatvorkach < >

int expr();



int term()
{ int value;
switch (symbol)
{
case LPAR : getsymbol(); value = expr(); getsymbol(); break;
case VALUE: value = attr; getsymbol(); break;
}
return value;
}

int expr()
{ int leftOp, rightOp; SymType sy;
leftOp = term();
while ((E symbol) & (E DELENIE | E NASOBENIE))
{
sy = symbol; getsymbol(); rightOp = term();
switch (sy)
{
case DELENIE :  leftOp = leftOp / rightOp ; break;
case NASOBENIE:  leftOp = rightOp * leftOp ; break;
}
}
return leftOp;
}


asociativity som nekukal, ale uz len z toho ze mas rozdielne priority nemozes mat obe operatory v jednej funkcii,



A ako to spravit? Vies mi to vystvelit prosim ta....?