2008-12-30 17 views
11

जावा कंपाइलर पार्स टाइपकास्ट कैसे करता है?

(x) - y 

जैसे एक साधारण अभिव्यक्ति का अर्थ भिन्न है कि x एक प्रकार का नाम है या नहीं। यदि x एक प्रकार का नाम नहीं है, तो (x) - yx से y को घटा देता है। लेकिन यदि x एक प्रकार का नाम है, (x) - yy के नकारात्मक की गणना करता है और परिणामस्वरूप मान x टाइप करने के लिए बनाता है।

एक सामान्य सी या सी ++ कंपाइलर में, x एक प्रकार है या नहीं, इसका सवाल उत्तरदायी है क्योंकि पार्सर इस तरह की जानकारी लेक्सर को संचारित करता है जैसे ही यह टाइपिफ़ या स्ट्रक्चर घोषणा को संसाधित करता है। (मुझे लगता है कि स्तरों के इस तरह के आवश्यक उल्लंघन सी के डिजाइन का सबसे नास्ट हिस्सा था)

लेकिन जावा में, x को बाद में स्रोत कोड में परिभाषित नहीं किया जा सकता है। जावा कंपाइलर इस तरह की अभिव्यक्ति को कैसे असंबद्ध करता है?

यह स्पष्ट है कि जावा कंपाइलर को कई पास की आवश्यकता होती है, क्योंकि जावा को घोषणा-पूर्व-उपयोग की आवश्यकता नहीं होती है। लेकिन ऐसा लगता है कि पहले पास को अभिव्यक्तियों को पार करने पर एक बहुत ही बेवकूफ नौकरी करना पड़ता है, और उसके बाद बाद में पास एक और अधिक सटीक, अभिव्यक्तियों का विश्लेषण करता है। यह अपमानजनक लगता है।

क्या कोई बेहतर तरीका है?

उत्तर

8

मुझे लगता है कि मुझे वह समाधान मिला है जो मुझे संतुष्ट करता है। Mmyers के लिए धन्यवाद, मुझे एहसास हुआ कि मुझे प्रकार के लिए वाक्यविन्यास के औपचारिक spec की जांच करने की जरूरत है।

अस्पष्टता + और - दोनों अनैरी और बाइनरी ऑपरेटरों के कारण होती है। जो जाने जाते हैं - जब तक डाली एक आदिम प्रकार का उपयोग करता

CastExpression: 
     (PrimitiveType Dimsopt) UnaryExpression 
     (ReferenceType) UnaryExpressionNotPlusMinus 

(http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#238146 देखें)

तो, '+' और '-' स्पष्ट रूप से एक कलाकारों के ')' के तुरंत बाद की अनुमति नहीं है: जावा इस व्याकरण से समस्या का हल कंपाइलर द्वारा एक प्राथमिकता।

+0

में वोट दिया जाना चाहिए, मैं वास्तव में कल्पना को देखने के लिए बहुत आलसी था (और मुझे नहीं पता था कि वैसे भी कहां देखना है)। +1 –

+1

इस उत्तर को स्वीकार करने पर विचार करें। –

2

मैं बस इसे बाहर का परीक्षण किया है और यह कोड:

Double y = new Double(0.1); 
System.out.println((Double)-y); 

एक संकलन त्रुटि देता है:

operator - cannot be applied to Double, java.lang.Double .

कोष्ठकों लाना आसपास -y यह ठीक संकलन बना देता है। तो स्पष्ट रूप से जावा इस समस्या को हल करता है कि इसे व्याकरण में अनुमति न दे (अगर यह सही शब्दावली है; मैं कंपाइलर्स पर एक विशेषज्ञ नहीं हूं)।

+0

मैंने डाउनवोट नहीं किया, लेकिन अगर डबल की बजाय आपने डबलर का इस्तेमाल किया था तो कंपाइलर ने इसे अनुमति दी होगी, क्योंकि _operator -_ को युगल पर लागू किया जा सकता है। मुझे विश्वास है कि यह उस अपर्याप्तता के लिए डाउनवॉट किया गया था। –

+0

जावा 1.5 के बाद से, आप किसी भी अंकगणितीय ऑपरेटर का उपयोग डबल्स, फ्लोट्स इत्यादि के साथ कर सकते हैं (ऑटोबॉक्सिंग के कारण)। जैसा कि मैंने कहा, जोड़ों को जोड़कर इसे त्रुटियों के बिना संकलित किया गया। –

+0

+1 क्योंकि मुझे कोई कारण नहीं दिख रहा है कि इस उत्तर को नकारात्मक – dancavallaro

संबंधित मुद्दे