2012-05-14 28 views
5

मुझे अपने लेज़र में और मेरे पार्सर में एक समस्या है।फ्लेक्स/बाइसन: खराब टोकन प्रबंधन?

सबसे पहले, मेरी lexer में मैंने ऐसे ही एक लाइन:

"if" beginScope(stOTHER); return IF; 

और मेरे पार्सर में:

stmt: IF '(' exp ')' stmts 
... 
stmts: stmt 
     | '{' stmt_list '}' 
     | '{' '}' 

ऐसे ही एक कोड में:

if(sth) { 
    dosth; 
} 

if(other) { 
    doothersth; 
} 

beginScope दो बार कहा जाएगा, क्योंकि (मुझे लगता है) बाइसन नहीं जानते कि if कथन का अंत कहां है, इसलिए जब यह IF टोकन पाया, वह उस if बयान के अंत के रूप में लेता है, और यह अन्य if बयान शुरू करने के लिए दूसरी बार पढ़ें ...

कृपया मेरी मदद करो ...

+0

आप 'beginScope()' के लिए "{" अपने फ्लेक्स में दाखिल फोन कर सकते हैं? इस तरह, जब आप "}" देखते हैं तो आप 'एंडस्कोप()' कर सकते हैं। बस इन सिंगल-कैरेक्टर एक्सप्रेशन्स को ओपनब्रैक और बाइसन के लिए बंद करने जैसे टोकन लौटाएं। – chrisaycock

+0

नहीं, मैं नहीं कर सकता, क्योंकि स्टार्टस्कोप को पैरामीटर में एक प्रकार की आवश्यकता होती है, और हमेशा "{" नहीं होता है क्योंकि आप – gnidmoo

+3

देख सकते हैं 'स्टार्टस्कोप' ऑपरेशन को अपने पार्सर क्रियाओं में ले जाएं। यदि आवश्यक हो तो एक [मध्य-नियम कार्रवाई] का उपयोग करें (http://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Actions.html)। लेक्सर के पास साइड इफेक्ट्स नहीं होने चाहिए, क्योंकि आपने जिस कारण से खोज की है। – zwol

उत्तर

1

जैक उल्लेख किया है टिप्पणी में, आप एक पार्सर कार्रवाई से beginScope बुलाना चाहिए:

stmt: IF { beginScope(stOTHER); } '(' exp ')' stmts