2013-01-19 35 views
27

C++ < ve >, tüm belirsizlikler içindeki bir "tuhaf" olduğunu düşünürdüm ama bir ayrıştırıcı uygulamaya çalışırken sonra ben < ve > kullandığı hemen her dil kırar bir örnek buldum jenerik türleri için:Java, C++, C#, vs. < and > ile bu sözdizimsel belirsizliği nasıl aşar?

f(g<h, i>(j)); 

Bu sözdizimsel ya bir jenerik yöntem çağrısı (g) olarak yorumlanabilir olabilir, ya da f iki karşılaştırmaların sonuçları veren olarak yorumlanabilir.

Bu diller (özellikle Java, which I thought was supposed to be LALR(1)-parsable?) bu sözdizimsel belirsizliği nasıl aşar?

Sadece bununla uğraştığım herhangi bir habersiz/bağlamsız bir yol düşünemiyorum, ve LALR (1) -parsable izin vermeden, böyle bir dilin bağlamı nasıl olabileceği konusunda şaşkınım. .

(hatta GLR ayrıştırıcı hiçbir bağlam ile bu bildirimin için tek ayrıştırma döndüremez dikkati çekiyor !! var)

+2

1 harika bir soru vardır, sadece bir not, java derleyicisinin, belirsizliği gidermek için birçok sezgisel etkisi vardır, bu da bol miktarda tahmin eder. Kendileri, jenerik sisteminin bozulduğunu ve başarısız oldukları vakaların olduğunu (her ne kadar oran olsalar da), java 8'in bazı sunumlarını açıkladıkları sunuma ve 8 nolu java'da nasıl ele alabileceklerine bakarlar. –

+0

@BenjaminGruenbaum: Teşekkürler. :) Sezgisel yaklaşımla ilgili olarak - iyi derleyici hata mesajları oluşturmak için kesinlikle harikalar, ama dil özelliklerinin dilbilgisinin bir parçası olmadıkça, belirsizlikleri çözmek için yasal olarak kullanılamazlar, değil mi? Ve eğer bunlar * dilbilgisinin bir parçasıysa, o zaman dilbilgisi bağlamdan nasıl özgür olabilir (yalnız LR (1) - ayrılabilir)? – Mehrdad

+2

değil amibugous, g'nin – NimChimpsky

cevap

3

bkz i > gr (j) bu yüzden herhangi bir belirsizlik :)

+0

Vay, haklısın ... ' (j)' olacağını düşündüm ama [görünüşe göre] (http://ideone.com/bYyaaj)! +1 Harika cevap, teşekkürler :) – Mehrdad

+0

Bu benim de tepkim vardı. Sanırım ayrıştırıcıları kolaylaştırıyor ve itiraf etmeliyim ki gerçekten çok çirkin bir hack. Langauge tasarımcıları tasarladıkları derleyicileri şikayet etmemeli; Böyle şeyler alırsın. –

2

sadece hayal edemiyorum herhangi/olmayan hacky bağlamdan-bağımsız bununla başa yolu ve ben böyle bir dili (1) -parsable yalnız LALR izin bağlamdan bağımsız olabilir nasıl şaşırmış ...

Yanıt, en azından Java ve C++ değil; C# hakkında çok az şey biliyorum. Bağlayacağınız Java dilbilgisi, jeneriklerin tanıtılmasından önce, 1996'ya kadar uzanır. daha fazla tartışma için

, java genel yöntem çağrısı < h olurdu Are C# and Java Grammars LALR(x)?

+0

Bir sembolün kullanımı, rasgele bir kod miktarıyla kullanımdan ayrılabilen beyanlara bağlı olarak, bir sembolün kullanımı bir tanımlayıcıyı veya bir tip adını gösterebildiğinden, C'nin tamamen bağlamı yoktur. – ebohlman