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