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




regex lex (4)

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

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

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

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


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

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

एक पंक्ति के लिए ... आप इसका उपयोग कर सकते हैं:

\"([^\\\"]|\\.)*\"  {/*matches string-literal on a single line*/;}

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

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