जेएलएस v7 के chapter 18 में व्याकरण प्रलेखन में कहीं और संरचनाओं से अलग दिखता है, लेकिन मेरे लिए भिन्नता प्रतीत होती है। विशेष रूप से अध्याय 15 में नियम हैं:क्या जावा 7 spec में व्याकरण वास्तव में बराबर है?
RelationalExpression:
ShiftExpression
RelationalExpression < ShiftExpression
RelationalExpression > ShiftExpression
RelationalExpression <= ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ReferenceType
जो foo instanceof Bar
एक RelationalExpression बनाता है (और इसलिए एक EqualityExpresson) जो बदले में EqualityExpression नियम जो foo instanceof Bar == false
एक EqualityExpression बनाता में एलएचएस रूप में इस्तेमाल किया जा सकता है।
लेकिन जब अध्याय 18 में व्याकरण को देखकर वे यह थोड़ा आसान बना दिया है:
Expression2:
Expression3 [Expression2Rest]
Expression2Rest:
{ InfixOp Expression3 }
instanceof Type
कौन सा अजीब लग रहा है, जिसका अर्थ है कि हम कर सकते हैं श्रृंखला एक साथ Expression3
द्विआधारी ऑपरेटरों या हम प्रकार की जांच कर सकते हैं साथ रों एक Expression3
का। विशेष रूप से अब foo instanceof Bar
एक Expression2
है, लेकिन मुझे नहीं लगता कि यह समानता तुलना के एलएचएस के रूप में Expression2
का उपयोग करने के लिए मान्य होगा।
क्या मुझे अध्याय 18 के व्याकरण में कुछ याद आया है जो foo instanceof Bar == false
को वैध अभिव्यक्ति बनाता है? ध्यान दें कि यह अध्याय 15 के नियमों और मेरे कंपाइलर के अनुसार नियमों के अनुसार एक मान्य अभिव्यक्ति है।
मुझे कल्पना में एक बग की तरह लगता है। ध्यान दें कि [जावा 8 spec के समकक्ष अनुभाग] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-19.html) अध्याय 15. के रूप में एक ही व्याकरण का उपयोग करता है। –
क्यों होगा यह एक समस्या है कि 'foo exampleof bar == false' वैध अभिव्यक्ति है? मैंने अभी इसकी जांच की है और संकलक इसे स्वीकार करता है। – Clashsoft
@Clashsoft कोई समस्या नहीं है, सिवाय इसके कि बाद के व्याकरण के अनुसार यह नहीं है: 'foo exampleof bar' एक 'अभिव्यक्ति 2' है और उसमें, लेकिन 'x == y' का एलएचएस 'अभिव्यक्ति 3' होना चाहिए। बेशक जब तक मुझे कुछ याद नहीं आया - जो (जो मैंने याद किया है) मेरे प्रश्न का उत्तर होगा। – skyking