मैंने पहले से ही एक जेनरेटर लिखा है जो चाल करता है, लेकिन मैं ऑफ-साइड नियम को लागू करने का सबसे अच्छा तरीका जानना चाहता हूं।आप ऑफ-साइड नियम को लागू करने के बारे में कैसे जाएंगे?
संक्षेप में: Off-side rule का अर्थ इस संदर्भ में है कि इंडेंटेशन को वाक्य रचनात्मक तत्व के रूप में पहचाना जा रहा है।
यहाँ tokenizers बनाने के लिए स्यूडोकोड में ऑफसाइड नियम यह है कि प्रयोग करने योग्य रूप में कब्जा खरोज, मैं नहीं चाहता कि भाषा के आधार पर जवाब को सीमित करना चाहते है:
token NEWLINE
matches r"\n\ *"
increase line count
pick up and store the indentation level
remember to also record the current level of parenthesis
procedure layout tokens
level = stack of indentation levels
push 0 to level
last_newline = none
per each token
if it is NEWLINE put it to last_newline and get next token
if last_newline contains something
extract new_level and parenthesis_count from last_newline
- if newline was inside parentheses, do nothing
- if new_level > level.top
push new_level to level
emit last_newline as INDENT token and clear last_newline
- if new_level == level.top
emit last_newline and clear last_newline
- otherwise
while new_level < level.top
pop from level
if new_level > level.top
freak out, indentation is broken.
emit last_newline as DEDENT token
clear last_newline
emit token
while level.top != 0
emit token as DEDENT token
pop from level
comments are ignored before they are getting into the layouter
layouter lies between a lexer and a parser
यह layouter में एक से अधिक NEWLINE उत्पन्न नहीं करता है समय, और इंडेंटेशन आने पर न्यूलाइन उत्पन्न नहीं करता है। इसलिए पार्सिंग नियम काफी सरल रहते हैं। यह बहुत अच्छा लगता है लेकिन मुझे लगता है कि इसे पूरा करने का बेहतर तरीका है या नहीं।
थोड़ी देर के लिए इसका उपयोग करते समय, मैंने देखा है कि DEDENTs के बाद भी नई लाइन को उत्सर्जित करना अच्छा हो सकता है, इस तरह आप अभिव्यक्ति के लिए ट्रेलर के रूप में इंडेंट डेडेंट को रखते हुए अभिव्यक्ति को NEWLINE से अलग कर सकते हैं।
आपका कोड एकाधिक DEDENTs को निकालने में सक्षम नहीं है, न ही यह ईओएफ से पहले समर्पित है। यह किसी चीज़ के लिए उपयोगी हो सकता है, लेकिन उन चीजें हैं जो ब्रांड्स समर्थन से अधिक महत्वपूर्ण हैं। – Cheery
इसके अलावा, कोष्ठक के लिए विशेष समर्थन के बारे में परेशान न करें, आप केवल सर्वोत्तम बिंदु को याद करने जा रहे हैं, जैसे कि पाइथन करता है। लेआउटिंग का बिंदु आपको उत्कृष्ट मल्टी-लाइन सिंटैक्स प्रदान करने की अनुमति देना है, यह ब्रांड्स के साथ संघर्ष नहीं करता है, जब तक कि आप उन दोनों को गठबंधन नहीं कर पाते। – Cheery
मेरा कोड एकाधिक डेडेंट उत्सर्जित करता है, इसलिए मुझे लगता है कि आप इसे गलत तरीके से पढ़ रहे हैं। लेकिन मैं मानता हूं कि मुझे ऐसा कुछ चाहिए जो पाइथन की बजाय हास्केल जैसा दिखता है, इसलिए मुझे एक नया दृष्टिकोण चाहिए। – dkagedal