2012-11-09 11 views
7

पर सेट है मैं tcpdump लॉग के लिए एक साधारण पार्सर लिख रहा हूं, क्या आप कृपया मुझे बता सकते हैं कि मुझे उचित लाइन नंबर क्यों नहीं मिल सकता है?फ्लेक्स yylineno 1

%{ 
char str[80]; 
%} 
%option yylineno 

... 
%% 

^{HOURS}:{MINUTES}:{MINUTES} if(input()=='.') { strcpy(str, yytext); BEGIN(A); } else {printf("Wrong hour %d", yylineno); } 
<A>({NDPS}|{DPS})\.({NDPS}|{DPS})\.({NDPS}|{DPS})|\.{NDPS} printf("Wrong IP!, %d", yylineno); 
<A>[ ]{DPS}\.{DPS}\.{DPS}\.{DPS} strcat(str, " from "); strcat(str, yytext+1); BEGIN(B); 
... 

उत्तर

11

जब मैं इस की कोशिश की, यह पता चला कि मैं एक नियम है कि वास्तव में के लिए yylineno अद्यतन करने की नई पंक्ति से मेल खाता है करने के लिए किया था। निम्नलिखित नियम के साथ यह काम करता है, और इसके बिना yylineno कभी नहीं बदला:

\n { } 
+1

बहुत समय बचाने के लिए धन्यवाद। फ्लेक्स के उपयोग के लिए उपयोगी टिप्स ढूंढना बहुत मुश्किल है। – Lukas

+1

ध्यान दें कि यदि आप 'flex' का उपयोग नहीं कर रहे हैं (लेकिन 'lex' या इसके किसी अन्य संस्करण का उपयोग कर रहे हैं), तो यह पर्याप्त नहीं हो सकता है। कुछ जानकारी के लिए [लेक्स: 'yylineno' लौटने 1] (http://stackoverflow.com/questions/31524630/lex-yylineno-returning-1) देखें (या, लघु रूप,' \ n {} '' ' एन {yylineno ++;} ')। यदि आप 'फ्लेक्स' का उपयोग कर रहे हैं, तो शायद यह एक अच्छा विचार नहीं है - यह शायद लाइन संख्या को दोगुना बढ़ा देता है, जो शायद काउंटर-उत्पादक है। –

+0

यदि हम वैसे भी बढ़ते लाइन नंबर पर नियम जोड़ रहे हैं, तो क्यों नहीं अपने स्वयं के लिनेनो चर को फ्लेक्स के आंतरिक से स्वतंत्र बनाएं? घोषणापत्र क्षेत्र में 'int my_yylineno = 1' डालें, और \ n {my_yylineno ++;} 'नियमों में –