SORU
29 Ocak 2013, Salı


C kapsamında ücretsiz veya bağlama duyarlı mı?

Ben genellikle C bağlam-duyarlı bir dil olduğunu iddia duydum. Aşağıdaki örnek alalım:

a b(c);

Bu değişken bir tanım veya işlev bildirimi nedir? Bu sembolün anlamı c bağlıdır. cdeğişkeno zaman a b(c); tanımlar bir değişkeni a yazın. b adlı Doğrudan c ile başlatılır. Ama eğer c Bir iseyazıno zaman a b(c); fonksiyon b adlı bildirir c döndürür a.

Eğer bağlam-ücretsiz dil tanımına bakarsanız, temelde tüm dilbilgisi kurallarını sol olması gerektiğini size söyleyecektir terminal tam bir sembol oluşur taraf. Bağlama duyarlı, öte yandan, terminal keyfi dizeleri ve sol tarafta terminal olmayan semboller izin gramerleri.

Ek dolaşırken, Bir", sol tarafı. olmayan-terminal tek bir sembol başka bir şey vardı tek bir dilbilgisi kuralı bulamadım "C Programlama Dili Bu C kapsamında ücretsiz olduğu anlamına gelir. (Tabii ki, her bağlam-ücretsiz dil olduğunu da bağlama duyarlı bir anlamı bağlam-ücretsiz dil şeklinde bir alt bağlam-duyarlı diller, ama önemli olan bu değil.)

C bağlam-ücretsiz veya bağlama duyarlı mı?

CEVAP
29 Ocak 2013, Salı


Aşağıda ise verilen bir tam sayı asal ise C (muhtemelen) olan bir program gösterir beri Turing-complete, sözdizimsel olarak doğru ve ayrıştırma neden (geçerli) en sevdiğim gösteri.

Bu iddiada bulunuyorumC de bağlamdan ne de içeriğe duyarlı olur.

Eğer izin rasgele sembol dizileri üzerinde her iki tarafın da herhangi bir üretim, üretmek bir Tür-0 dilbilgisi ("sınırsız") Chomsky hierarchy, hangisi daha güçlü bir bağlam-duyarlı dilbilgisi; sınırsız gramerleri vardır Turing-complete. Bir bağlam-duyarlı (Tip-1) dilbilgisi sağlar birden çok simgeleri bağlam Sol tarafta bir üretim değil, fakat aynı bağlam gerekir görünür sağ tarafında üretimi (bu nedenle adı "bağlam-duyarlı"). [1] bağlama duyarlı gramerleri linear-bounded Turing machines. eşdeğerdir

Örnek program, Başbakan hesaplama olabilir tarafından gerçekleştirilecek bir doğrusal-sınırlı Turing makinesi, bu kadar değil oldukça kanıtlamak Turing denklik, ama en önemli parçası olan ayrıştırıcı ihtiyaçlarını gerçekleştirmek için hesaplama gerçekleştirmek amacıyla sözdizimsel analiz. Şablon bir örnekleme olarak herhangi bir hesaplama ifade olabilirdi ve C şablon örnekleme Turing-tam inanmak için her türlü sebep var. Örneğin, Todd L. Veldhuizen's 2003 paper bkz.

Ne olursa olsun, C kesinlikle Turing makinesi tarafından ayrıştırılır olabilir yani bir bilgisayar tarafından çözümlenen olabilir. Sonuç olarak, sınırsız bir dilbilgisi tanımak. Aslında böyle bir dilbilgisi yazma standart bunu yapmak istemiyor bu yüzden pratik olurdu. (Aşağıya bakınız.)

Bu konuda "belirsizlik" bazı ifadeler çoğunlukla kırmızı ringa olduğunu. Başlamak için, belirsizlik belirli bir dilbilgisi, bir dili olmayan bir özelliktir. Eğer bir dil anlaşılır gramer ispat edilebilir olsa bile, eğer açık kaynak kodlu bir dilbilgisi tarafından kabul edilebilir, ücretsiz içerik. Açık kaynak kodlu bir dilbilgisi tarafından kabul edilemez ama bağlam-duyarlı dilbilgisi tarafından kabul edilebilir benzer şekilde, bağlama duyarlı. Belirsizlik söz konusu.

Ama 21 (14 *yani*) programında aşağıda çizgi gibi, herhangi bir olay, ifadeler belirsiz değildir; sadece farklı içeriğe bağlı olarak ayrıştırılır. En basit ifadesi sorunu, sözdizimsel kategorinin belirli tanımlayıcıları bağımlı nasıl ilan edildi (türleri ve fonksiyonları, örneğin), bu demek oluyor ki resmi dil hiç tanımıyor aslında bu iki keyfi uzunlukta dizeleri aynı program ile aynı (beyan ve kullanın). Bu "" dilbilgisi, aynı kelimenin arka arkaya iki tam kopyalarını tanır dilbilgisi. kopya tarafından modellenmiş olabilir Kolay bu dili ücretsiz içerik-olmayan pumping lemma ile kanıtlamak. Bu soru için bu dili mümkün, ve bir Tip-0 dilbilgisi cevap verilir bağlam-duyarlı dilbilgisi: http://math.stackexchange.com/questions/163830/context-sensitive-grammar-for-the-copy-language .

Eğer bir bağlam-duyarlı (veya) sınırsız bir dilbilgisi yazma C ayrıştırılamıyor girişimi olsaydı , muhtemelen bir nota ile evrenin doldurmak olur oldukça. C ayrıştırmak için Turing bir makine yazma eşit derecede imkansız bir girişim olurdu. Hatta C de bir program yazmak zordur, ve bildiğim kadarıyla hiçbiri doğru kanıtlanmıştır. Bu standart tam resmi bir dilbilgisi sağlamak denemez neden ve teknik İngilizce ayrıştırma bazı kuralları yazmak için tercih nedeni budur.

C standardı, resmi bir dilbilgisi neye benzediğini C dilinin sözdizimi tam resmi tanımı değildir. Daha resmileştirmek için olabilir önişleme sonra dili, tam resmi tanımı değil. (O değil dildir: C dili ile tanımlanır standart içerir işleyişi, ve operasyonun işleyişi tarif algoritmik yana olurdu son derece zor açıklamak için herhangi bir gramer formalizm. Sözlü bozunma açıklanan standardın bu bölümü, bir kez daha uygulanması gereken bir yerde kurallar da dahil olmak üzere.)

Çeşitli gramer (üst üste gelen iki gramerleri için sözcüksel analiz, hangisi gerçekleşir önce önişleme ve diğer, gerekirse, daha sonra, artı "sözdizimsel" dilbilgisi) toplanan Ek A, bu ÖNEMLİ NOT (vurgu eklenmiştir):

C sözdizimi bu özet anlama yardımcı olmak için tasarlanmıştır.Dilin tam bir ifade değil. Özellikle, dilbilgisi burada anlatılan bir kabul eder . ben^>geçerli C yapıları için birebir. Başlığın kuralları (6.8, 7.1, 10.2) beyanları, ifadeleri ayırt etmek için uygulanması gerekir. Ayrıca, access kontrol, belirsizlik ve yazım kuralları sözdizimsel ama anlamsız yapıları geçerli otu kullanılmalıdır.

Son olarak, burada söz programı. Satır 21 IsPrime<N> N asal ise yalnızca sözdizimsel olarak doğru. Aksi takdirde, typen bir tamsayı, bir şablon değildir, typen<1>() sözdizimsel () bir sözdizimi kurallarına göre değil, çünkü yanlış bir geçerli ifade eden (typen<1)>() olarak ayrıştırılır.

template<bool V> struct answer { answer(int) {} bool operator()(){return V;}};

template<bool no, bool yes, int f, int p> struct IsPrimeHelper
  : IsPrimeHelper<p % f == 0, f * f >= p, f   2, p> {};
template<bool yes, int f, int p> struct IsPrimeHelper<true, yes, f, p> { using type = answer<false>; };
template<int f, int p> struct IsPrimeHelper<false, true, f, p> { using type = answer<true>; };

template<int I> using IsPrime = typename IsPrimeHelper<!(I&1), false, 3, I>::type;
template<int I>
struct X { static const int i = I; int a[i]; }; 

template<typename A> struct foo;
template<>struct foo<answer<true>>{
  template<int I> using typen = X<I>;
};
template<> struct foo<answer<false>>{
  static const int typen = 0;
};

int main() {
  auto b = foo<IsPrime<234799>>::typen<1>(); // Syntax error if not prime
  return 0;
}

[1] Daha teknik olarak koymak, bağlam-duyarlı dilbilgisi her üretim biçiminde olması gerekir:

αAβ → αγβ

A non-terminal ve 23*,* 24 ** nerede muhtemelen dilbilgisi semboller boş dizileri ve γ boş olmayan bir dizidir. (Dilbilgisi semboller ya terminaller ya da non-Terminal) olabilir.

Bu bağlam [α, β] 26 *olarak okunabilir. Bağlam-ücretsiz (Tip 2) dil bilgisi, α β boş olması gerekir.

Ayrıca "" her üretim biçiminde olması gerektiği kısıtlama,:. monoton olan gramer kısıtlayabilirsiniz çıkıyor

|α| ≥ |β| > 0 * * * * α → β (|α| demek "α uzunluğu")

Bunun mümkün olmadığını kümesinin dil kabul monoton gramer tam olarak aynı olarak ayarla, dillere tanınan ve bağlam-duyarlı gramerleri ve bu durum genellikle o daha da kolaylaşır Bankası provaları monoton gramerleri. Sonuç olarak, oldukça sık görmek "bağlam-duyarlı" hissederek "" kullanılır. monoton

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • InfoPuppet

    InfoPuppet

    15 Kasım 2011
  • Jesse Pimenta

    Jesse Piment

    5 EKİM 2011
  • Joe DiFeo

    Joe DiFeo

    7 AĞUSTOS 2012