Is C++ context-free or context-sensitive?
Często słyszę roszczenia, że C ++ jest językiem kontekstowym. Weź następujący przykład:
a b(c);
Czy jest to definicja zmiennej lub deklaracja funkcji? To zależy od znaczenia symboluc
. Jeślic
jestzmienna, następniea b(c);
definiuje zmienną o nazwieb
typua
. Jest bezpośrednio inicjowany za pomocąc
. Ale jeślic
jestrodzaj, następniea b(c);
deklaruje nazwę funkcjib
to trwac
i zwracaa
.
Jeśli spojrzysz na definicję języków bezkontekstowych, to w zasadzie powiedzą ci, że wszystkie reguły gramatyczne muszą mieć lewostronne boki, które składają się z dokładnie jednego nie-końcowego symbolu. Z drugiej strony gramatyki kontekstowe pozwalają na dowolne ciągi symboli terminala i symboli nieterminalnych po lewej stronie.
Przeglądając Dodatek A do „Języka programowania C ++”, nie mogłem znaleźć ani jednej reguły gramatycznej, która miałaby coś innego niż pojedynczy symbol nie-końcowy po lewej stronie. Oznaczałoby to, że C ++ jest bezkontekstowy. (Oczywiście, każdy język bezkontekstowy jest także wrażliwy na kontekst w tym sensie, że języki bezkontekstowe tworzą podzbiór języków wrażliwych na kontekst, ale to nie o to chodzi).
Czy więc C ++ jest kontekstowy czy kontekstowy?