2009-04-22 15 views
5

मेरे पास स्कूल के लिए एक परियोजना है जहां हमें फ्लेक्स और बाइसन का उपयोग करने की आवश्यकता है। मैं सी ++ का उपयोग करना चाहता हूं ताकि मेरे पास एसटीएल और मेरे स्वयं के वर्गों तक पहुंच हो। हम निम्नलिखित Makefile के साथ प्रदान किया गया:मैं फ्लेक्स और बाइसन में सी ++ का उपयोग कैसे करूं?

CC = gcc 
CFLAGS = -g 

OBJs = parse.tab.o symtab.o attr.o lex.yy.o 

default: parser 

parser: ${OBJs} 
    ${CC} ${CFLAGS} ${OBJs} -o parser -lfl 

lex.yy.c: scan.l parse.tab.h attr.h 
    flex -i scan.l 

parse.tab.c: parse.y attr.h symtab.h 
    bison -dv parse.y 

parse.tab.h: parse.tab.c 

clean: 
    rm -f parser lex.yy.c *.o parse.tab.[ch] parse.output 

depend: 
    makedepend -I. *.c 

scan.l और parse.y कुछ प्रारंभिक फ्लेक्स/जंगली भैंसों सामान स्कैनर और पार्सर उत्पन्न करने के लिए किया है। मुझे अपनी फाइलों को उन फाइलों में जोड़ना होगा। symtab। {एच, सी} प्रतीक तालिका का कार्यान्वयन माना जाता है। attr। {एच, सी} कुछ विशेषता जादू के लिए हैं। मैं symtab.c a .cc फ़ाइल बनाना चाहता हूं ताकि मैं एसटीएल का उपयोग कर सकूं। मेरे पास C++ का उपयोग करने के इच्छुक अन्य कारण भी हैं।

मैंने एक parse.ypp फ़ाइल का उपयोग करने की कोशिश की, ताकि एक .cpp फ़ाइल जेनरेट की जाएगी। लेकिन समस्या यह है कि मुझे सही नहीं मिल रहा है। एच फाइल। मैं इस तरह देखने के लिए Makefile बदल दिया है:

CC = g++   # Change gcc to g++ 
CFLAGS = -g 

OBJs = lex.yy.o parse.tab.o symtab.o attr.o 

default: lex.yy.c parser # added lex.yy.c so I could just keep lex stuff in C since I don't really need C++ there 

parser: ${OBJs} 
    ${CC} ${CFLAGS} ${OBJs} -o parser -lfl 

lex.yy.o: scan.l parse.tab.h attr.h  # added this rule to use gcc instead of g++ 
    gcc -c -o lex.yy.o lex.yy.c 

lex.yy.c: scan.l parse.tab.h attr.h 
    flex -i scan.l 

parse.tab.cpp: parse.ypp attr.h symtab.h 
    bison -dv parse.ypp 

parse.tab.h: parse.tab.cpp  # I want a parse.tab.h but I get parse.tab.hpp 

clean: 
    rm -f parser lex.yy.c *.o parse.tab.cpp parse.tab.h parse.output 

depend: 
    makedepend -I. *.c 

कोई मुझे बता सकते हैं कि मैं क्या जोड़ सकते हैं या सी ++ काम कर पाने के लिए क्या करना चाहिए? यह ध्यान दिया जाना चाहिए कि मैंने सी से सी ++ में जाने के साथ निपटने के लिए .y (या .ypp) फ़ाइल में कुछ सामान जोड़ा। विशेष रूप से, मुझे कुछ सामान बाहरी के रूप में घोषित करना पड़ा। मेरी मुख्य समस्या यह है कि जब मैं चलाता हूं, scan.l में वाक्यविन्यास त्रुटियों का एक गुच्छा है, और ऐसा लगता है क्योंकि इसमें parse.tab.h शामिल नहीं हो सकता है (क्योंकि यह कभी उत्पन्न नहीं होता है)।

+0

रिकॉर्ड के लिए, फ्लेक्स में + या - सी ++ कमांड लाइन झंडे सी के बजाय सी ++ लेक्सर उत्पन्न करने के लिए हैं। उस पर ध्यान देने पर विचार करें, हालांकि मुझे नहीं लगता कि यह इस मामले में आपकी समस्या है। –

उत्तर

3

सी ++ का उपयोग करने के लिए आपको फ्लेक्स या बाइसन के साथ कुछ भी करने की ज़रूरत नहीं है, मैंने इसे कई बार किया है। आपको बस यह सुनिश्चित करना होगा कि आप जी ++ का प्रयोग करें, जीसीसी नहीं।

आपकी समस्याएं मेकफ़ाइल के साथ हैं, कोड नहीं।

+0

इसे बहुत देर से स्वीकार करना: -) ... लेकिन जैसा कि मुझे याद है कि यह सही था और मुझे बस अपने मेकफ़ाइल के साथ खेलने की आवश्यकता थी। धन्यवाद। – Tom

0

या तो एक सी कंपाइलर या सी ++ कंपाइलर का उपयोग करें, लेकिन दोनों नहीं (जब तक आप नहीं जानते कि आप क्या कर रहे हैं)। आप निश्चित रूप से अपने पैरों दोनों पर कई बार खुद को शूट करना सुनिश्चित कर रहे हैं। मिक्सिंग जीसीसी और जी ++ अच्छा नहीं है।

इस लाइन संदिग्ध है:

lex.yy.o: scan.l parse.tab.h attr.h  # added this ... 
gcc -c -o lex.yy.o lex.yy.c 

इसके अलावा, आप का उपयोग कर जीवन को आसान बना दिया है चाहते हैं, कहीं भी CC ज़रिये जुड़े हुए हैं नहीं है।

मान लीजिए कि आप सी कोड की एक पंक्ति नहीं बदलते हैं, तो आप संभवतः कुछ त्रुटियों और कुछ चेतावनियों को छोड़ देंगे (जैसे बहिष्कृत हेडर आदि)। आपको उन्हें भी ठीक करना होगा।

-1

यदि आप सी ++ में पार्सर्स कर रहे हैं तो मैं Boost Spirit को देखने की अनुशंसा करता हूं। यह बाइसन/yacc से संभाल करने के लिए बहुत अच्छा है।

here से

:

आत्मा एक वस्तु उन्मुख रिकर्सिव-डिसेंट पार्सर जेनरेटर टेम्पलेट मेटा प्रोग्रामिंग तकनीक का उपयोग लागू किया रूपरेखा है। अभिव्यक्ति टेम्पलेट्स हमें सी ++ में विस्तारित बैकस-सामान्य फॉर्म (ईबीएनएफ) के सिंटैक्स का अनुमान लगाने की अनुमति देते हैं।

+4

मैं असहमत हूं।मैंने दोनों की कोशिश की है और मुझे बेहतर बाइस पसंद है (हालांकि मैं दोनों पर एएनटीएलआर पसंद करता हूं)। सी ++ में ईबीएनएफ फिट करने के लिए आवश्यक अजीब वाक्यविन्यास व्याकरण को पढ़ने में बहुत मुश्किल बनाता है। – Zifre

+4

इस मामले में कोई विकल्प नहीं है, क्योंकि उसे अपनी परियोजना के लिए बाइसन/फ्लेक्स का उपयोग करने की आवश्यकता है। इसके अलावा, सी ++ में सब कुछ बूस्ट के साथ नहीं किया जाना चाहिए। –

+3

आत्मा वहां सबसे बुरी और अत्यधिक जटिल सी ++ पुस्तकालयों में से एक है। अगर कुछ भी यह देखने में एक सनकी प्रयास से ज्यादा कुछ नहीं है कि सी ++ में किस प्रकार के ऑपरेटर अधिभारित हो सकते हैं। – Hippicoder

1

कुछ अंतर हैं जिन्हें आप विस्तार से देख सकते हैं here

4
For using flex with C++: 
1: read the flex docs: 
2: use flex -+ -o file.cc parser.ll 
3: In the .ll file: 

%option c++ 
%option yyclass="Your_class_name" 
%option batch 

4: In your .hh file, derive Your_class_name from public yyFlexLexer 
5: you can then use your_class_instance.yylex() 
+0

उदाहरण के लिए, अपनी robots.txt फ्लेक्स पार्सर जो SCons साथ बनाया गया है के लिए यह उतना ही आसान है के रूप में: thisenv.CXXFile (लक्ष्य = 'Robots_flex.cc', स्रोत = 'robots.ll') और Robots.cc निर्माता है: रोबोट :: रोबोट्स (std :: istream * इन): yyFlexLexer (में, 0), [...] – piotr

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