Kiedyś myślałem, C++ było „dziwne” jeden ze wszystkich niejasności z <
i >
, ale po próbie wdrożenia parser Chyba znalazłem przykład, który łamie tylko o każdy język, który używa <
i >
dla typów generycznych:W jaki sposób Java, C++, C#, itp. Omija tę szczególną syntaktyczną dwuznaczność z < and >?
f(g<h, i>(j));
Może to być interpretowane jako składniowo albo wywołanie metody rodzajowe (g
), czy może to być interpretowane jako dające f
wynikami dwóch porównań.
W jaki sposób takie języki (szczególnie Java, which I thought was supposed to be LALR(1)-parsable?) omijają tę składnię dwuznaczności?
Po prostu nie wyobrażam sobie żadnego niehackowego/pozbawionego kontekstu sposobu radzenia sobie z tym i jestem zaskoczony tym, jak każdy taki język może być pozbawiony kontekstu, nie mówiąc już o LALR (1). .
(warto zauważyć, że nawet parser GLR nie może wrócić pojedynczy przetwarza na tym rachunku bez kontekstu !!)
+1 wielkie pytanie, Tylko uwaga, kompilator java ma wiele heurystyk, aby rozwiązać niejednoznaczność, to wiele. Oni sami przyznają, że ich ogólny system jest zepsuty i zdarzają się przypadki, w których się nie udaje (choć są to stawki), spójrzcie na prezentację funkcji java 8, wyjaśnijcie niektóre problemy i jak będą je rozwiązywać w java 8. –
@BenjaminGruenbaum: Dzięki. :) Jeśli chodzi o heurystykę - są one z pewnością świetne do generowania dobrych komunikatów o błędach kompilatora, ale jeśli nie są częścią gramatyki języka, nie mogą być legalnie wykorzystane do rozwiązania niejasności, prawda? A jeśli * są * częścią gramatyki, to w jaki sposób gramatyka może być pozbawiona kontekstu (nie mówiąc już o LR (1))? – Mehrdad
jego nie jest amibugous, to zależy od tego, co g jest zadeklarowane jako – NimChimpsky