c फ्लेक्स/लेक्स में एक स्ट्रिंग शाब्दिक के लिए नियमित अभिव्यक्ति




regex lex (5)

एक स्ट्रिंग में एक उद्धरण चिह्न होता है

"

शून्य या उससे अधिक के बाद या तो कुछ भी बच गया

\\.

या एक गैर-उद्धरण चरित्र

[^"\\]

और अंत में एक समाप्ति उद्धरण

"

यह सब एक साथ रखो, और तुम्हें मिल गया है

\"(\\.|[^"\\])*\"

परिसीमन उद्धरण से बच जाते हैं क्योंकि वे फ्लेक्स मेटा-वर्ण हैं।

मैं फ्लेक्स सीखने के लिए प्रयोग कर रहा हूं और स्ट्रिंग शाब्दिकों से मेल खाना चाहूंगा। मेरा कोड वर्तमान में जैसा दिखता है:

"\""([^\n\"\\]*(\\[.\n])*)*"\""        {/*matches string-literal*/;}

मैं एक-एक घंटे से बदलावों से जूझ रहा हूं और इसे उस तरह से काम नहीं कर सकता जैसे इसे करना चाहिए। मैं अनिवार्य रूप से एक स्ट्रिंग शाब्दिक से मेल खाने की उम्मीद कर रहा हूं जिसमें एक नई-रेखा नहीं हो सकती (जब तक कि यह बच न जाए) और बच गए पात्रों का समर्थन करता है।

मैं शायद केवल एक खराब नियमित अभिव्यक्ति या फ्लेक्स के साथ एक असंगत लिख रहा हूं। कृपया सलाह दें!


यह हम Zolang में सिंगल लाइन स्ट्रिंग शाब्दिक के लिए एम्बेडेड टेम्प्लेट ${...}

\"(\$\{.*\}|\\.|[^\"\\])*\"


कैसे एक शुरुआत राज्य का उपयोग करने के बारे में ...

int enter_dblquotes = 0;

%x DBLQUOTES
%%

\"  { BEGIN(DBLQUOTES); enter_dblquotes++; }

<DBLQUOTES>*\" 
{ 
   if (enter_dblquotes){
       handle_this_dblquotes(yytext); 
       BEGIN(INITIAL); /* revert back to normal */
       enter_dblquotes--; 
   } 
}
         ...more rules follow...

यह उस प्रभाव के समान था (फ्लेक्स %s या %x का उपयोग करता है यह इंगित करने के लिए कि राज्य से क्या अपेक्षा की जाएगी। जब फ्लेक्स इनपुट एक उद्धरण का पता लगाता है, तो यह दूसरे राज्य में स्विच हो जाता है, तब तक लेक्सिंग जारी रखता है जब तक कि यह किसी अन्य उद्धरण तक नहीं पहुंचता, जिसमें यह वापस लौटता है सामान्य अवस्था में।


एक उत्तर जो देर से आता है, लेकिन जो अगले एक के लिए उपयोगी हो सकता है, उसे इसकी आवश्यकता होगी:

\"(([^\"]|\\\")*[^\\])?\"

फ्लेक्स में स्ट्रिंग को संभालने के बारे में मेरा कोड स्निपेट पेस्ट करें, आशा है कि आपकी सोच को प्रेरित करेगा।

स्ट्रिंग शाब्दिक को संभालने के लिए स्टार्ट कंडीशन का उपयोग अधिक स्केलेबल और स्पष्ट होगा।

%x SINGLE_STRING

%%

\"                          BEGIN(SINGLE_STRING);
<SINGLE_STRING>{
  \n                        yyerror("the string misses \" to termiate before newline");
  <<EOF>>                   yyerror("the string misses \" to terminate before EOF");
  ([^\\\"]|\\.)*            {/* do your work like save in here */}
  \"                        BEGIN(INITIAL);
  .                         ;
}






flex-lexer