2009-02-22 12 views
7

फ्लेक्स में पर एकाधिक टोकन वापस जाने के लिए एक रास्ता है, मैं एक नियमित अभिव्यक्ति में से एक मैच के लिए कई टोकन वापस जाने के लिए चाहते हैं। क्या इसे करने का कोई तरीका है?FLEX: वहाँ एक बार

उत्तर

0

क्या आपका मतलब सभी मैचों का है? क्या आप रेगेक्स फ़ंक्शन या स्ट्रिंग फ़ंक्शंस का उपयोग कर रहे हैं? वैश्विक ध्वज का प्रयोग करें।

फ्लेक्स के लिए, मुझे नहीं लगता कि आप ऐसा कर सकते हैं। आप एक समय में एक पैटर्न के साथ एक मैच के लिए परीक्षण करते हैं ताकि संभवतः यह दायरे से बाहर हो। तुम उसे क्यों चाहते हो? एक अनुकूलन के रूप में? मुद्दों को स्कॉइंग?

+0

ईमानदार होने के लिए, मैं फ्लेक्स के लिए बिल्कुल नया हूं और मुझे यकीन नहीं है। मैंने सोचा कि मैं नियमित अभिव्यक्तियों और स्ट्रिंग मिलान के संयोजन का उपयोग कर रहा था। यहाँ एक उदाहरण है "(" \t \t {L_PAREN वापसी;} { INT} {yylval.Int = atoi (yytext); INT वापसी;} क्या मैं चाहता हूँ एक बार में दो टोकन वापस जाने के लिए सक्षम होने के लिए है । – Eburetto

2

जिस तरह से मैं यह कर रहा हूं वह है कि वापस आने वाले टोकन की कतार बनाएं, और yylex() की शुरुआत में, टोकन की जांच करें और उन्हें वापस कर दें।

-1

आमतौर पर, यह स्कैनर जो आप अधिक स्वच्छ कोड देता है के शीर्ष पर एक पार्सर द्वारा नियंत्रित किया जाता। आप राज्यों के साथ कुछ हद तक है कि का अनुकरण कर सकते हैं:

%option noyywrap 

%top { 
#define TOKEN_LEFT_PAREN 4711 
#define TOKEN_RIGHT_PAREN 4712 
#define TOKEN_NUMBER  4713 
} 

%x PAREN_STATE 
%% 
"("   BEGIN(PAREN_STATE); return TOKEN_LEFT_PAREN; 
<PAREN_STATE>{ 
    [0-9]+ return TOKEN_NUMBER; 
    ")"  BEGIN(INITIAL); return TOKEN_RIGHT_PAREN; 
    .|\n  /* maybe signal syntax error here */ 
} 
%% 
int main (int argc, char *argv []) 
{ 
    int i; 

    while ((i = yylex())) 
    printf ("%d\n", i); 

    return 0; 
} 

लेकिन इसे शीघ्र ही के रूप में अपने व्याकरण हो जाता है और अधिक जटिल के रूप में बहुत गंदा हो जाएगा।

संबंधित मुद्दे