Programski prevodioci 1/K1 2022
Pređi na navigaciju
Pređi na pretragu
Prvi kolokvijum 2022. godine održan je 31. oktobra i trajao je 90 minuta. Postavka roka još uvek nije zvanično dostupna sa stranice predmeta.
1. zadatak
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Postavka
Data su tri deterministička automata, M, N i P.
- Napraviti deterministički konačni automat K koji prihvata sekvence tipa , gde su sve sekvence koje automat M odbija, a i sekvence koje automati N i P prihvataju, respektivno.
- Od automata iz tačke pod a napraviti desno-linearnu gramatiku, a zatim iz nje izbaciti sve nedostižne ili mrtve neterminale.
0 | 1 | Prihvata | |
---|---|---|---|
A | A | B | 0 |
B | B | C | 1 |
C | A | C | 1 |
1 | 2 | Prihvata | |
---|---|---|---|
D | E | 1 | |
E | D | E | 0 |
F | F | E | 1 |
0 | a | Prihvata | |
---|---|---|---|
1 | 1 | 2 | 1 |
2 | 1 | 0 |
Rešenje
1 | 2 | 0 | a | Prihvata | |
---|---|---|---|---|---|
D | E | 0 | |||
E | D,1 | E | 0 | ||
F | F,1 | E | 0 | ||
1 | 1 | 2 | 1 | ||
2 | 1 | 0 |
1 | 2 | 0 | a | Prihvata | |
---|---|---|---|---|---|
D,1 | E | 1 | 2 | 1 | |
E | D,1 | E | 0 | ||
1 | 1 | 2 | 1 | ||
2 | 2 | 0 |
0 | 1 | 2 | a | Prihvata | |
---|---|---|---|---|---|
A | A | B | 1 | ||
B | B | C | 0 | ||
C | A | C | 0 | ||
D,1 | 1 | E | 2 | 1 | |
E | D,1 | E | 0 | ||
1 | 1 | 2 | 1 | ||
2 | 1 | 0 |
0 | 1 | 2 | a | 1 | |
---|---|---|---|---|---|
{A,D,1}, S0 | A,1 | B,E | 2 | 1 | |
{A,1}, S1 | A,1 | B | 2 | 1 | |
{B,E}, S2 | B | C,D,1 | E | 0 | |
{2}, S3 | 1 | 0 | |||
{B}, S4 | B | C | 0 | ||
{C,D,1}, S5 | A,1 | C,E | 2 | 1 | |
{E}, S6 | D,1 | E | 0 | ||
{1}, S7 | 1 | 2 | 1 | ||
{C}, S8 | A | C | 0 | ||
{C,E}, S9 | A | C,D,1 | E | 0 | |
{D,1}, S10 | 1 | E | 2 | 1 | |
{A}, S11 | A | B | 1 |
2. zadatak
Postavka
Aritmetički izraz se sastoji iz nula ili više brojeva, gde je broj niz cifara, sa aritmetičkim operacijama sabiranja ili oduzimanja između njih. Ukoliko su terminali u datoj azbuci jedna cifra ("CIFRA"), znak za sabiranje ("+") i znak za oduzimanje ("-") napisati regularni izraz koji opisuje date aritmetičke izraze, a zatim ga pretvoriti u deterministički konačni automat korišćenjem metoda pozicija.
Rešenje
Pozicija | Sledeća pozicija |
---|---|
1 | 1,2,3,5 |
2 | 4 |
3 | 4 |
4 | 1,2,3,4,5 |
5 | / |
CIFRA | + | - | Prihvata | |
---|---|---|---|---|
1,5 | 1,2,3,5 | 1 | ||
1,2,3,5 | 1,2,3,5 | 4 | 4 | 1 |
4 | 1,2,3,4,5 | 0 | ||
1,2,3,4,5 | 1,2,3,4,5 | 4 | 4 | 1 |
3. zadatak
Postavka
Napisati fragment programskog koda koji implementira konačni automat sa slike:
- eksplicitnom predstavom funkcije stanja
- implicitnom predstavom funkcija stanja
Rešenje
a)
class FSM
{
enum State {
S0( false ),
S1( true ),
ERROR( false );
final boolean accepting;
State( boolean accepting ) {
this.accepting = accepting;
}
}
static State state;
static void handleInput(int ch)
{
switch( state )
{
case S0:
if ( ch==0 )
state = State.S1;
else
state = State.ERROR;
break;
case S1:
if ( ch==0 )
state = State.S1;
else if ( ch==1 )
state = State.S0;
break;
case ERROR:
state = State.ERROR;
break;
}
}
public static void main(String[] args) throws java.io.IOException
{
int ch;
state = State.S0;
while ((ch = System.in.read ()) != '\n')
handleInput(ch);
if (state.accepting)
System.out.println("Prihvata");
else
System.out.println("Odbija");
}
}
b)
class FSM_TT
{
enum State {
S0( false ),
S1( true ),
ERROR( false );
final boolean accepting;
State( boolean accepting ) {
this.accepting = accepting;
}
}
static State state;
static State transition[3][2] =
{
{ State.S1, State.ERROR},
{ State.S1, State.S0},
{ State.ERROR, State.ERROR}
};
static void handleInput(int ch)
{
int index;
switch( ch )
{
case 0:
index=0;
break;
case 1:
index=1;
break;
default:
state=State.ERROR;
return;
}
state = transition[state.ordinal()][index];
}
public static void main(String[] args) throws java.io.IOException
{
int ch;
state = State.S0;
while ((ch = System.in.read ()) != '\n')
handleInput(ch);
if (state.accepting)
System.out.println("Prihvata");
else
System.out.println("Odbija");
}
}