2009-11-22 11 views
5

का उपयोग करने का प्रयास करने के लिए मुझे कुछ कोड पार्स करने के लिए फ्लेक्स और बाइसन का उपयोग करने की आवश्यकता है।बाइसन YYSTYPE: char *

वाई वाईएसटीवाईई का डिफ़ॉल्ट प्रकार int है, भले ही मैंने इसे कभी भी घोषित नहीं किया। क्या यह बाइसन से डिफ़ॉल्ट है?

इससे स्ट्रिंग्स को वापस करने में बहुत मदद मिलेगी। मैंने इसे पढ़ा: How to solve Bison warning "... has no declared type" यह एक अच्छा दृष्टिकोण की तरह दिखता है। (मुझे अभी तक एक संघ की पूर्ण शक्ति की आवश्यकता नहीं है, केवल char * भाग है, लेकिन मैं संघ का भी उपयोग कर सकता हूं क्योंकि यह बाद में सहायक हो सकता है।)

यह मेरे लिए काम नहीं कर रहा है।

[a-zA-Z]+[a-zA-Z0-9]* { yylval.str = strdup(yytext); return yident;} 

क्या किसी और की आवश्यकता है:

%union { 
    char *str; 
} 

%type<str> ConstExpression ConstFactor Type 

यहाँ मेरी .l फ़ाइल से एक पंक्ति है:

y:111.37-38: $1 of `ConstExpression' has no declared type 
y:113.34-35: $1 of `ConstFactor' has no declared type 
y:114.35-36: $1 of `ConstFactor' has no declared type 
y:119.34-35: $1 of `Type' has no declared type 
y:109.23-48: warning: type clash on default action: <str> != <> 
y:115.23-27: warning: type clash on default action: <str> != <> 
[...more of the same snipped...] 

यहाँ मेरी y व्याकरण फ़ाइल से घोषणाओं हैं: मैं इन त्रुटियों को मिलता है त्रुटियों को हल करने के लिए क्या करना है?

+1

आप को गंभीरता से लगता है कि लोगों को यह देखे बिना अपने व्याकरण फ़ाइल डीबग कर सकते हैं में अपने टोकन प्रकार को परिभाषित करने की जरूरत है ? –

+6

@ किनोपिको, क्या आपने गंभीरता से इसे कम किया है क्योंकि उसने अपना पूरा होमवर्क पेस्ट नहीं किया और कहा "मुझे तह कोडेज़ दिखाएं"? क्या आपको यह कहने के लिए मार डाला होगा कि "मुझे और जानकारी चाहिए, कृपया पूरी व्याकरण फ़ाइल पोस्ट करें" या कुछ ऐसे? – steveha

+1

@ किनोपिको, जब वह आपके द्वारा अनुरोधित जानकारी पोस्ट करता है, तो क्या आप अपना डाउनवोट पूर्ववत कर देंगे? यह बस कठोर लगता है। – steveha

उत्तर

6

असल में, मुझे पूरा यकीन है कि मुझे पता है कि व्याकरण को देखे बिना क्या गलत है।

टर्मिनल प्रतीकों के प्रकारों को भी घोषित करना आवश्यक है, क्योंकि वे कर सकते हैं और अक्सर अर्थपूर्ण मूल्य वापस कर सकते हैं। ID और NUMBER जैसी चीज़ों के बारे में सोचें, जिनमें yyval डेटा है। लेकिन yacc के पास यह जानने का कोई तरीका नहीं है कि यह सिर्फ 'x' या कुछ और है, और नियम में डिफ़ॉल्ट कार्रवाई है: $$ = $1

उदाहरण के लिए, निम्नलिखित व्याकरण इसे yacc के माध्यम से ठीक बनाता है, लेकिन एक को हटाने का प्रयास करें नीचे %type से प्रतीकों में से अधिक से अधिक:

%union { 
    char *s; 
} 

%type <s> r1 r2 'x' 

%% 

r1: r2; 

r2: 'x' { printf("%s\n", $1); }; 
3

आप शायद सिर्फ याक फ़ाइल

%token<str> yident 
+0

मुझे लगता है कि यह सही है - यदि आप लेक्स फ़ाइल में एक char * लौटाते हैं, तो आप% प्रकार का उपयोग नहीं करते हैं, जो बाइसन के लिए है प्रकार के ... – alternative

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