SORU
12 EKİM 2014, Pazar


Java C den ayrıştırmak için daha kolay kılan nedir?

Ben tanışmış olması, the grammars of C and C are context-sensitive ve özellikle gereken bir "lexer hack" C. diğer taraftan, ben altında bir izlenim yapabilirsiniz ayrıştırma Java ile sadece 2 belirteçleri bak ileriye, rağmen hatırı sayılır bir benzerlik arasındaki iki dil.

Bunu ayrıştırmak için daha uysal yapmak için C değiştirmek için ne yapardınız?

C bağlam-duyarlılık gördüğüm örneklerin hepsi teknik olarak izin verilen ama çok garip çünkü ben soruyorum. Örneğin,

foo (a);

boşluk ile foo fonksiyon arayabilir tartışma a. Ya da, a foo, ama o kadar kolay dayalı parantez kurtulabilirsin türde bir nesne ilan edilmesi olabilir. Bu tuhaf "" C grammar yerine getirmesi için Üretim kuralı her iki işlevleri ve değişkenleri bildirmek, çift amaçlı. doğrudan Bildiricisi oluşur

Diğer taraftan, Java grammar değişken tanımlama ve işlev bildirimi için ayrı üretim kuralları vardır. Eğer yazarsanız

foo a;

sonra bir değişken bildiriminde olduğunu biliyorsun ve foo açıkça bir typename olarak ayrıştırılması. Bu ise sınıf foo bir yerde geçerli kapsamın tanımlanmış bulmazlarsa geçerli bir kod olmayabilir, ama daha sonra derleyici bir seferde gerçekleştirilebilecek semantik analizi için bir iş.

C zor ayrıştırmak için olduğunu söyledi typedef yüzünden gördüm ama Java kendi türleri de bildirebilirsiniz. C dilbilgisi kuralları olan, direct_declarator, hatalı olan dışında mı?

CEVAP
12 EKİM 2014, Pazar


Ayrıştırma C zor oluyor. Java ayrıştırma gibi sert olmaya başladı.

Bu SO answer discussing why C (and C ) is "hard" to parse bkz. Kısa Özet C ve C dirgramerleridoğal olarak belirsizdir; birden fazla ayrıştırır ve size verecektirgerekirbağlam belirsizlikleri gidermek için kullanın. İnsanları ayrıştırmak gibi belirsizlikleri gidermek için kabul edelim; yani, aşağıya bakın. Eğer ayrıştırılamadı olarak belirsizlikler çözme ısrar ederseniz, sizin ayrıştırıcı daha karmaşık ve çok daha fazla inşa etmek için alır; ama bu karmaşıklık kendi kendini yaraladı.

IIRC, Java 1.4 "(1) dilbilgisi belirsiz değildi, "" ayrıştırılamadı. kolay oldu" LALR bariz Modern Java en azından uzun mesafe yerel belirsizlikleri yok o kadar emin değilim; her zaman karar vermeden sorunu var "...^< . " iki şablonları kapatır ya da "sağa kaydırma operatörü". modern Java does not parse with LALR(1) anymore şüpheleniyorum.

Ama güçlü ayrıştırıcıları (ya da C ve C olarak zayıf ayrıştırıcıları ve içerik toplama kesmek ön uçları çoğunlukla şimdi), her iki dilde kullanarak ayrıştırma sorunu aşamıyoruz. C ve C göründüklerinden daha basit; bu uygulamada daha karmaşık olan ek komplikasyon var. Bir iddiaya C ve C ayrıştırıcıları el ile yazılmış olması çok zor olmasıdır. It isn't true; you can build Java and C parsers just fine with GLR parser generators.

Ama ayrıştırma sorun nerede gerçekten değil.

Ayrıştırma sonra, AST/ayrıştırma ağacı ile bir şeyler yapmak isteyeceksiniz. Uygulamada, tanımı nedir ve nerede kullanılır, her tanımlayıcı için, bilmeniz gerekir ("adı ve türü çözümlemesi", sloppily, bina sembol tablo). Bu işler için ÇOK daha fazla çalışmak daha ayrıştırıcı değil, bileşik tarafından kalıtım, arayüzler, aşırı yükleme ve şablonlar, ve şaşırmış tarafından aslında semantiği için tüm bu yazılı kayıt dışı doğal dil yayılmış onlarca yüzlerce sayfa dili standart. C çok kötü işte. Java 7 ve 8 bu açıdan çok kötü olmaya başladı. (Ve Sembol tabloları ihtiyacınız olan tüm değildir; uzun bir deneme için özgeçmişimi görmek "Ayrıştırma Sonra Yaşam").

En millet mücadelesi ile saf ayrıştırma parçası (genellikle hiç terbiye; BÖYLECE kendisi için bir çok soru hakkında nasıl inşa çalışan ayrıştırıcıları için gerçek dilleri), bu yüzden onlar hiç görmek hayattan sonra ayrıştırma. Ve daha sonra ayrıştırmak için zor olduğu hakkında halk teoremleri ve bu aşamadan sonra ne olacağı hakkında hiç bir sinyal alıyoruz.

C sözdizimi sabitleme seni bir yere götürmez.

C sözdizimini değiştirme ile ilgili: yama bir çok yerde herhangi bir C gramer olarak yerel ve gerçek belirsizlikler çeşitli bakmak gerekir bulabilirsiniz. Eğer ısrar ediyorsan, 17**. Eğer C Standartları Kurulu değilse bunu yaparken nokta yoktur iddia ediyorum; sen de öyle yaptım, ve bir derleyici kullanılarak inşa edilmiş, kimsenin aklı başında kullanmak istiyorsunuz. Çok fazla C mevcut uygulamalar adamlar ayrıştırıcıları bina kolaylık için geçiş yapmak için yatırım var; ayrıca, acılarını sona erdi ve mevcut ayrıştırıcıları iyi çalışır.

Kendi ayrıştırıcı yazmak isteyebilirsiniz. TAMAM, sorun değil; sadece toplumun geri kalanı senin için daha kolay yapmak için kullanmaları gereken dili değiştirmek için beklemeyin. Onlar onlar için daha kolay, ve bu belgelenmiş ve uygulanan bu kelimeleri kullanacak.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • jbignacio

    jbignacio

    13 Mart 2006
  • Sorikan

    Sorikan

    3 ŞUBAT 2008
  • The Scary Snowman

    The Scary Sn

    1 ŞUBAT 2011