2009-07-15 11 views
5

में प्रारंभिक राज्यों में मैं एक पार्सर जनरेटर के लिए फ्लेक्स और बायसन का उपयोग कर रहा हूं, लेकिन मेरे स्कैनर में प्रारंभिक राज्यों में समस्याएं हैं।लेक्स/फ्लेक्स

मैं विशेष नियमों का उपयोग कर रहा हूँ टिप्पणी से निपटने के लिए है, लेकिन इस व्याकरण उद्धृत टोकन मिलान करने के लिए प्रतीत नहीं होता: लाइन इस सरल उदाहरण में

%x COMMENT 

//     { BEGIN(COMMENT); } 
<COMMENT>[^\n]  ; 
<COMMENT>\n   { BEGIN(INITIAL); } 

"=="     { return EQUALEQUAL; } 

.      ; 

:

// a == b 

'isn टी पूरी तरह से एक टिप्पणी के रूप में मेल नहीं खाता, जब तक कि मैं इस नियम को शामिल नहीं करता:

<COMMENT>"=="    ; 

मैं इसके साथ कैसे घूम सकता हूं इन सभी टोकन को मेरे विशेष नियमों में जोड़ना नहीं है?

उत्तर

9

मिलान लेक्स/फ्लेक्स या जो कुछ भी में सी-शैली टिप्पणी अच्छी तरह से प्रलेखित:

in the documentation, साथ ही इंटरनेट भर के विभिन्न रूपों।

यहाँ फ्लेक्स दस्तावेज में पाया गया कि पर एक भिन्नता है:

<INITIAL>{ 
    "//"    BEGIN(IN_COMMENT); 
    } 
    <IN_COMMENT>{ 
    \n  BEGIN(INITIAL); 
    [^\n]+ // eat comment 
    "/"  // eat the lone/
    } 
+0

मैं नहीं बल्कि समावेशी राज्यों का उपयोग करने के रूप में मैं नियमों का एक बहुत कुछ है अगर यह बचा जा सकता है की जरूरत नहीं होगी। समस्या यह है कि 'टिप्पणी खाएं' नियम एक से अधिक वर्णों (जैसे ==) के साथ टोकन से मेल नहीं खाता प्रतीत होता है। – Dan

+0

तब मुझे लगता है कि आप कुछ गलत कर रहे हैं। आपको टिप्पणियों के लिए 'उप पार्सर' बनाना होगा, जो आपके सामान्य टोकन से मेल नहीं खाता है। –

+0

कहें, आप प्रत्येक इनपुट की रेखा को स्टोर करना चाहते हैं, तो क्या यह आपको गलत लाइन नंबर देगा? –

2

जोड़ने की कोशिश एक "+" [^ n] शासन के बाद। मुझे नहीं पता कि क्यों एकमात्र राज्य अभी भी एक विशेष राज्य में '==' उठा रहा है, लेकिन स्पष्ट रूप से यह है। फ्लेक्स आमतौर पर उस नियम से मेल खाता है जो अधिकांश पाठ से मेल खाता है, और "+" जोड़ना कम से कम दो नियमों को टाई करेगा। पहले कमेंट नियम डालने से इसका इस्तेमाल टाई के मामले में किया जाएगा।

0

सुराग है:

समस्या है इस 'टिप्पणी खाने' शासन के साथ एक से अधिक चरित्र

तो एक * शून्य से मेल करने के लिए जोड़ टोकन मिलान करने के लिए प्रतीत नहीं होता या अधिक गैर-न्यूलाइन। आप शून्य चाहते हैं अन्यथा एक खाली टिप्पणी मेल नहीं खाएगी।

%x COMMENT 

//     { BEGIN(COMMENT); } 
<COMMENT>[^\n]*  ; 
<COMMENT>\n   { BEGIN(INITIAL); } 

"=="     { return EQUALEQUAL; } 

.      ; 
+0

पास कर सकते हैं, एक खाली टिप्पणी उस नियम के लिए एक मैच ट्रिगर नहीं करेगी, न ही इसकी आवश्यकता है। – Darryl

+0

सच है, सच है, नीचे की रेखा जो इसे पकड़ती है। इसलिए आप * को + को बदलने के लिए सुरक्षित हैं –