notacja BNF

0

Napisać gramatykę która dopuszcza ciąg znaków aabbcc lub abc lub aaabbbccc, chodzi o to żeby k-sztuk liter a oraz l-sztuk liter b i m-sztuk liter c była taka sama ilość (k=l=m).
Jak to zrobić?

0

Też mi problem:

bool isvalid(char *p) // p = "aaabbbccc"
{
	int  baselen;
	char *start = p;
	char c = *p++; if (!c) return false; // pierwsza litera
	while (*p == c) p++; // znajdź literę różną od pierwszej
	baselen = p - start; // wymagana ilość jednakowych liter

	while (isalpha(*p))
	{
		start = p;
		c = *p++;
		while (*p == c) p++;
		if ((p - start) != baselen) return false;
	}
	return true;
}
0

a to jest notacja BNF?

0

Nie, on napisał kod w C testujący czy podane slowo nalezy do danej gramatyki.
A ty jeśli nie wiesz co to jest i nie odróżniasz C od BNF to nie wiem co robisz na studiach informatycznych (a teorii Języków Formalnych chyba nie ma na innych kierunkach...)

0
Shalom napisał(a)

Nie, on napisał kod w C testujący czy podane slowo nalezy do danej gramatyki.
A ty jeśli nie wiesz co to jest i nie odróżniasz C od BNF to nie wiem co robisz na studiach informatycznych (a teorii Języków Formalnych chyba nie ma na innych kierunkach...)

Mi się wydaje, że to jednak kolega z kodem C się mocno wygłupił, a kolejny post to raczej pytanie retoryczne było :>

Co do tematu, wydaje mi się, że zwykłe BNF nie jest w stanie opisać takiej gramatyki. EBNF mogłoby zwyczajnie opisać zdanie jako a{1,n}b{1,n}c{1,n} ale nie mam pomysłu jak zrobić to tutaj.

Jeżeli natomiast dopuszczasz BNF zależny kontekstowo to (z neta):

<sentence> ::= abc | a<thing>bc
<thing>b ::= b<thing>
<thing>c ::= <other>bcc
a<other> ::= aa | aa<thing>
b<other> ::= <other>b

<sentence> => a<thing>bc => ab<thing>c
=> ab<other>bcc => a<other>bbcc => aabbcc

0

Hm, to a{1,n} to jednak też nie jest takie proste. I również niezgodne z notacją. Rozwiązanie, które przychodzi mi do głowy jest chyba zbyt abstrakcyjne jak na EBNF...

1 użytkowników online, w tym zalogowanych: 0, gości: 1