In questa attività devi scrivere un programma che legge un'espressione regolare e genera un altro programma che genera se una stringa di input è accettata da quell'espressione regolare. L'output deve essere un programma scritto nella stessa lingua della richiesta.
Ingresso
L'input è un'espressione regolare r corrispondente al seguente ABNF (la regola di produzione iniziale è REGEX
):
REGEX = *( STAR / GROUP / LITERAL / ALTERNATIVE )
STAR = REGEX '*'
GROUP = '(' REGEX ')'
LITERAL = ALPHA / DIGIT
ALTERNATIVE = REGEX '|' REGEX
Se l'input non corrisponde a questa grammatica, il comportamento del programma non è definito.
Interpretazione
Interpreta l'input come espressione regolare, dove *
è la stella di Kleene (che significa ripetere l'argomento sinistro zero o più volte ), |
è un'alternativa, (
e il )
gruppo e nessun operatore sono affatto concatenati. Il raggruppamento ha la precedenza sulla stella, la stella ha la precedenza sulla concatenazione, la concatenazione ha la precedenza sull'alternativa.
Si dice che una stringa sia accettata se il regex corrisponde all'intera stringa.
Produzione
L'output del programma è un altro programma scritto nella stessa lingua come la vostra presentazione che legge una stringa s in modo implementazione definita in fase di esecuzione, le uscite se r accetta s e poi termina. L'output può essere eseguito in modo definito dall'utente, sebbene per i programmi accettati e rifiutati debbano esserci solo due output distinti.
Si può presumere che l'input del programma di output non sia mai più lungo di 2 16 -1 byte.
restrizioni
Né l'invio né alcun programma generato dall'invio possono utilizzare funzionalità integrate o librerie
- abbina regex
- trasforma le espressioni regolari
- compilare espressioni regolari
- generare parser da una grammatica
- semplifica il problema in modo che la tua presentazione diventi banale
punteggio
Il punteggio della tua presentazione è il numero di caratteri. Vince l'invio con il punteggio più basso.
Casi test
Tutte le prove contengono un'espressione regolare, una serie di stringhe accettate, una serie di stringhe rifiutate e un programma di esempio in C99 che è un output valido di un invio (ipotetico) C99.
(espressione regolare vuota)
Stringhe accettate
- (input vuoto)
Stringhe rifiutate
- foo
- bar
- baz
- quux
Programma di esempio
#include <stdio.h>
int main() {
char input[65536];
gets(input);
return input[0] != 0;
}
(b|)(ab)*(a|)
( a
e b
alternando)
stringhe accettate
a
ba
abababababa
abab
stringhe rifiutate
afba
foo
babba
programma di esempio
#include <stdio.h>
int main() {
char input[65536];
int state = 0;
for (;;) switch (state) {
case 0: switch (getchar()) {
case 'a': state = 1; break;
case 'b': state = 2; break;
case EOF: return 0;
default: return 1;
} break;
case 1: switch (getchar()) {
case 'b': state = 2; break;
case EOF: return 0;
default: return 1;
} break;
case 2: switch (getchar()) {
case 'a': state = 1; break;
case EOF: return 0;
default: return 1;
} break;
}
(0|1(0|1)*)(|A(0|1)*1)
(numeri binari in virgola mobile)
stringhe accettate
- 10110100
- 0
- 1A00001
stringhe rifiutate
- 011
- 10A
- 1A00
- 100A010
return (regex.match(stdin) is not null)
non sia permesso avere un programma simile .