2009-05-20 10 views
6

मैं वाईएसीसी (वास्तव में बाइसन) में एक व्याकरण लिख रहा हूं, और मुझे एक बदलाव/समस्या कम हो रही है। इसके बाद पोस्टफिक्स वृद्धि और कमी ऑपरेटर शामिल हैं। यहाँ व्याकरण का एक कांट छांट संस्करण है:वाईएसीसी शिफ्ट को ठीक करने/पोस्ट-वृद्धि ऑपरेटर से संघर्ष कैसे कम करें?

%token NUMBER ID INC DEC 

%left  '+' '-' 
%left  '*' '/' 
%right  PREINC 
%left  POSTINC 

%% 

expr: NUMBER 
|  ID 
|  expr '+' expr 
|  expr '-' expr 
|  expr '*' expr 
|  expr '/' expr 
|  INC expr %prec PREINC 
|  DEC expr %prec PREINC 
|  expr INC %prec POSTINC 
|  expr DEC %prec POSTINC 
|  '(' expr ')' 
; 

%% 

बाइसन मुझसे कहता है 12 पारी/संघर्ष को कम देखते हैं, लेकिन अगर मैं पोस्टफ़िक्स वेतन वृद्धि और घटती के लिए लाइनों बाहर टिप्पणी, यह ठीक काम करता है। क्या कोई इस संघर्ष को ठीक करने के बारे में जानता है? इस बिंदु पर, मैं एक एलएल (के) पार्सर जेनरेटर पर जाने पर विचार कर रहा हूं, जो इसे अधिक आसान बनाता है, लेकिन एलएएलआर व्याकरण हमेशा लिखने के लिए और अधिक प्राकृतिक लग रहा है। मैं जीएलआर पर भी विचार कर रहा हूं, लेकिन मुझे किसी भी अच्छे सी/सी ++ जीएलआर पार्सर जनरेटर के बारे में पता नहीं है।

+3

यदि कम मतदाता कम से कम कारण बताएंगे तो मैं इसकी सराहना करता हूं ... – Zifre

उत्तर

3

यदि आप विकल्प अनुभाग में %glr-parser निर्दिष्ट करते हैं तो बायसन/वाईएसी एक जीएलआर पार्सर उत्पन्न कर सकता है।

+0

वाह! मुझे यह नहीं पता था ... मैंने अभी कोशिश की है, लेकिन मुझे अभी भी शिफ्ट-मेरे मूल व्याकरण के साथ संघर्ष कम हो गया है। मुझे लगता है कि बाइसन के जीएलआर एल्गोरिदम अच्छी तरह से अच्छी तरह से सहयोग नहीं करता है, लेकिन यह डेविड डॉल्सन के जवाब के साथ संयोजन में काम कर सकता है। – Zifre

+0

ठीक है, मैंने बस डेविड डॉल्सन की विधि के साथ यह कोशिश की, और यह काम करता है! – Zifre

+1

-1: जीएलआर मोड का उपयोग करना इसके लिए एक अच्छा समाधान नहीं है, क्योंकि आपको अभी भी अस्पष्टता को हल करने की आवश्यकता है, और, इससे भी बदतर, अगर आप अस्पष्टता को ठीक नहीं करते हैं, तो बाइसन शिकायत के बिना व्याकरण को चुपचाप स्वीकार करेगा, और दे आप इसके बजाए रनटाइम त्रुटियां करते हैं, इसलिए यह सोचना आसान है कि आपने समस्या को ठीक कर दिया है जब आपने नहीं किया है। –

0

मुझे और आइटम परिभाषित करना पसंद है। आपको% बाएं,% दाएं,% सटीक सामान की आवश्यकता नहीं होनी चाहिए।

simple_expr: NUMBER 
| INC simple_expr 
| DEC simple_expr 
| '(' expr ')' 
; 

term: simple_expr 
| term '*' simple_expr 
| term '/' simple_expr 
; 

expr: term 
| expr '+' term 
| expr '-' term 
; 

इस दृष्टिकोण के साथ खेलें।

+1

मैंने पहले उस दृष्टिकोण की कोशिश की है, और मुझे यह पसंद नहीं है। जब आपके पास अधिक जटिल अभिव्यक्ति व्याकरण होते हैं (जैसे सी ++), तो यह समझना मुश्किल हो जाता है कि अगर आप इसे संशोधित करना चाहते हैं तो आपको क्या करना है। प्राथमिकता का उपयोग करना बहुत साफ है, आईएमओ। – Zifre

2

इस प्रयास करें:

%token NUMBER ID INC DEC 

%left  '+' '-' 
%left  '*' '/' 
%nonassoc '++' '--' 
%left  '(' 
%% 

expr: NUMBER 
|  ID 
|  expr '+' expr 
|  expr '-' expr 
|  expr '*' expr 
|  expr '/' expr 
|  '++' expr 
|  '--' expr 
|  expr '++' 
|  expr '--' 
|  '(' expr ')' 
; 

%% 

कुंजी गैर साहचर्य रूप पोस्टफ़िक्स ऑपरेटरों घोषित करने के लिए है। नहीं तो आप

++var++-- 

कोष्ठक भी बदलाव को कम से कम करने के लिए एक पूर्वता दिए जाने की जरूरत करने में सक्षम होगा/चेतावनी

+0

दरअसल, सामान्य सी व्यवहार के लिए आप '++ var ++' को '++ (var ++)' के रूप में पार्स करना चाहते हैं और त्रुटि के रूप में अस्वीकार नहीं किया जाना चाहिए (पोस्टफिक्स उच्च प्राथमिकता है जो उपसर्ग है), आप '% दाएं ''% nonassoc' –

+0

इसके अलावा, '' ('' के लिए प्राथमिकता है क्योंकि इसमें कोई संघर्ष नहीं है। यदि आप संघर्ष थे तो आपको इसकी आवश्यकता होगी (उदाहरण के लिए, यदि आपने सी-स्टाइल फ़ंक्शन कॉल या कास्ट सिंटैक्स जोड़ा है), लेकिन इसमें उस मामले में आप संभवतः '% दाएं ''% बाएं' नहीं चाहते हैं –

-1

preincrement और postincrement ऑपरेटरों nonassoc तो परिभाषित कि पूर्वता खंड में है को कम करने और नियमों बनाने %prec

0

इस बुनियादी समस्या का उपयोग करके इन ऑपरेटरों उच्च का पूर्वता है कि आप INC और DEC टोकन एक पूर्वता नहीं है, तो यह कैसे INC या 0 से अग्रदर्शी शामिल अस्पष्टता को हल करने को नहीं जानता है। आप पूर्वता सूची के अंत में

%right INC DEC 

जोड़ेंगे, तो वह इसे ठीक करेंगे और आप भी सभी PREINC/POSTINC सामान से छुटकारा पा सकते हैं (आप unaries उच्च पूर्वता और पोस्टफ़िक्स उपसर्ग से अधिक होना चाहते हैं) , क्योंकि यह अप्रासंगिक है।

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