मैं बाइसन + फ्लेक्स में ब्लॉक डिलीमीटर के रूप में इंडेंटेशन को कार्यान्वित करने के तरीके को घायल करता हूं। बस अजगर की तरह। मैं अपनी खुद की प्रोग्रामिंग भाषा लिख रहा हूं (ज्यादातर मज़ेदार के लिए, लेकिन मैं इसे एक गेम इंजन के साथ उपयोग करने का इरादा रखता हूं), मैं कुछ विशेष बात करने की कोशिश करूंगा जो बॉयलरप्लेट को कम करता है और देव गति को अधिकतम करता है।बाइसन और फ्लेक्स के साथ ब्लॉक डिलीमीटर के रूप में इंडेंटेशन का उपयोग कैसे करें
मैंने सी में पहले से ही एक कंपाइलर लिखा है (वास्तव में 'langToy' नासम अनुवादक), लेकिन असफल रहा। किसी कारण से यह केवल संपूर्ण स्रोत फ़ाइल में एक स्ट्रिंग को संभालने में सक्षम था (ठीक है, मैं 48 घंटे से अधिक समय तक जाग रहा था - इसलिए ... आप जानते हैं, मस्तिष्क मंदी)।
मुझे नहीं पता कि घुंघराले ब्रैकेट और/या शुरू -> अंत को कार्यान्वित करना आसान है (मुझे ऐसा करने में समस्या नहीं है) या यदि यह मेरा दिमाग है जो ताला लगा है।
अग्रिम धन्यवाद!
अद्यतन: ठीक है, मैं कैसे फ्लेक्स के साथ यह करने के लिए के बारे में कोई सुराग नहीं है। मुझे पार्सर में कई डीडेंट्स लौटने में समस्याएं हैं। फ्लेक्स/बाइसन मेरे लिए अपेक्षाकृत नए हैं।
अद्यतन 2: यह फ्लेक्स फ़ाइल मैं अब तक के साथ आ गया है; यह काफी यह नहीं मिलता है:
%x t
%option noyywrap
%{
int lineno = 0, ntab = 0, ltab = 0, dedent = 0;
%}
%%
<*>\n { ntab = 0; BEGIN(t); }
<t>\t { ++ntab; }
<t>. { int i; /* my compiler complains not c99 if i use for(int i=0... */
if(ntab > ltab)
printf("> indent >\n");
else if(ntab < ltab)
for(i = 0; i < ltab - ntab; i++)
printf("< dedent <\n");
else
printf("= =\n");
ltab = ntab; ntab = 0;
BEGIN(INITIAL);
/* move to next rule */
REJECT;}
. /* ignore everything else for now */
%%
main()
{
yyin = fopen("test", "r");
yylex();
}
आप इसे के साथ चारों ओर खेलने की कोशिश कर सकते हैं, हो सकता है आप को देखता है मैं क्या याद कर रहा हूँ। कई समर्पण लौटने से हेक्से में आसानी होगी (वापसी t_dedent (num);)।
यह कोड हमेशा इंडेंट/समर्पण से मेल नहीं खाता है।
अद्यतन 3: मुझे लगता है कि मैं फ्लेक्स पर उम्मीद छोड़ दे देंगे और यह अपने तरीके से करते हैं, किसी को भी जानता है कि कैसे फ्लेक्स में यह करने के लिए मैं इसे वैसे भी सुन कर खुशी होगी।
ऐसा लगता है कि आपको यह मिला है, लेकिन मैं टैबस्टॉप को 2 रिक्त स्थान के रूप में गिनना चाहता हूं। तो मुझे लगता है कि लाइन current_line_indent = (current_line_indent + 2) & ~1; – Frank
हाँ - जब आप एक टैब देखते हैं, तो आपको अगले टैबस्टॉप पर current_line_indent को टक्कर करने की आवश्यकता होती है। –