2011-06-09 16 views
10

मैंने लगभग हर सामग्री ऑनलाइन खोज की है। लेकिन मैं अभी भी उलझन में हूं क्यों लेक्सर यिलवल की पहचान नहीं कर सकता है।येलल फ्लेक्स और बाइसन के साथ अपरिभाषित

यहाँ मामला है: मैं node.h में एडीटी के एक झुंड में परिभाषित किया गया है और उन्हें node.c में एहसास है, मेरा उद्देश्य एक एएसटी उत्पन्न करने के लिए के बाद इन संरचनाओं ठीक से जमा हो जाती है है। लेकिन मैं बाइसन फाइल से फंस गया हूँ।

पहले, मैं union YYSTYPE {...}; और typedef union YYSTYPE YYSTYPE; को %union बदलने के लिए, मैं नहीं कारण है कि मैं ऐसा करने की जरूरत है, कुछ अन्य फ़ाइलों को ऑनलाइन पोस्ट %uinion साथ अच्छी तरह से काम करने लगता है है।

फिर, मैं yylval चीजों से चिपक गया हूं। मैंने bison -d चीजें की हैं, और इसे पहले ही parser.c में चेक किया है (मैंने बाइसन आउटपुट निर्दिष्ट किया है), इसलिए मुझे लगता है कि extern YYSTYPE yylval; काम करना चाहिए। लेकिन ऐसा नहीं है। तो मुझे आश्चर्य है कि यिलवल अविकसित समस्या को हल करने का कोई और तरीका है या नहीं।

मैं केवल YYSTYPE struct, int और char * के दो प्रकार का उपयोग करें, मैं एएसटी के लिए संघ YYSYTPE और struct अलग कर सकते हैं? इसका मतलब है, nonterminals कोई संबंधित प्रकार नहीं होगा। क्या आपके पास कोई अन्य विचार है ??

+0

मैं अभी भी आश्चर्य है कि तुम क्या मतलब है "एएसटी के लिए संघ' YYSTYPE' और struct अलग "है, और मैं यह आवश्यक नहीं लगता। बाइसन में '% यूनियन' और '% टाइप' का उपयोग करते समय आपको समस्याएं मिली हैं? – neuront

+0

@ यूरोंट हां, मैं आपसे सहमत हूं। हमें बाइसन में YYSTYPE को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता नहीं है। लेकिन बात यह है कि मैं ऐसा करने के बिना इसे प्राप्त नहीं कर सकता।दूसरे शब्दों में, हालांकि '% संघ' और'% संघ YYSTYPE' उसी तरह काम करता है, हालांकि, मेरे मामले में, मुझे बाद वाले को चुनना होगा। मुझे नहीं पता क्यों? '% संघ' और'% प्रकार' के लिए, मैं उनके बीच संबंधों को जानता हूं। मैं बस 'YYSTYPE अपरिभाषित' के साथ त्रुटि को हल करने के बारे में जानता हूं। जब मैंने ऑनलाइन खोज की, तो मुझे यह एक आम समस्या मिली। – chenrui

उत्तर

1

आपको% संघ का उपयोग करना चाहिए। आपको संघ को टाइप करने की आवश्यकता नहीं है।

आप किसी भी घोषणा के साथ हेडर फ़ाइल प्राप्त करने के लिए बाइसन-डी का उपयोग करते हैं (जैसे टर्मिनलों, nonterminals, और टोकन के प्रकार)। उदाहरण:

bison -d parser.y दो फाइलें, parser.tab.c और parser.tab.h उत्पन्न करेंगे। आप बाद की फ़ाइल को अपनी लेक्सर फ़ाइल में शामिल कर सकते हैं, इसलिए यह आपके %token परिभाषाओं के बारे में जानेंगे। इस फ़ाइल में यिलवल और इसके प्रकार की परिभाषा भी शामिल है।

आपको संघ को अलग नहीं करना चाहिए क्योंकि आप इसे विस्तारित करेंगे और लेक्सर और पार्सर के बीच संचार के लिए इसकी आवश्यकता होगी।

5

मामले में यह दूसरों के लिए मदद की है, मैं, कि सहित

extern YYSTYPE yylval; 
मेरी लेक्स स्रोत में

एक 'yylval अपरिभाषित' समस्या को रोकने के लिए अपर्याप्त था (OpenBSD लेक्स v2.5.4 + याक) में पाया गया है, भले ही y.tab.c फ़ाइल है:

#define YYSTYPE int 
extern YYSTYPE yyltype 
01:

#ifndef YYSTYPE 
typedef int YYSTYPE; 
#endif 

मैं लेक्स स्रोत में स्पष्ट परिभाषा डालकर इस तय

हालांकि, मैं स्पष्ट नहीं है कि इस तरह से परिभाषित करने याक स्रोत फ़ाइल के स्थान के लिए प्रचार करेंगे ...

0

आप% शुद्ध पार्सर (या समान) अपने .y फ़ाइल में सेट करें? यह सामान्य लेक्स घोषणाओं को अक्षम करता है, क्योंकि वे पुनः प्रवेश नहीं कर रहे हैं।

https://www.gnu.org/software/bison/manual/html_node/Pure-Decl.html