में लिस्प व्याकरण मैं एक लिस्प व्याकरण बनाने की कोशिश कर रहा हूं। आसान, सही? जाहिरा तौर पर नहीं।yacc
मैं के रूप में पास के रूप में मैं बता सकता हूँ इन इनपुट प्रस्तुत करते हैं और त्रुटियों का सामना करना ...
(1 1)
23 23 23
ui ui
यह व्याकरण है ...
%%
sexpr: atom {printf("matched sexpr\n");}
| list
;
list: '(' members ')' {printf("matched list\n");}
| '('')' {printf("matched empty list\n");}
;
members: sexpr {printf("members 1\n");}
| sexpr members {printf("members 2\n");}
;
atom: ID {printf("ID\n");}
| NUM {printf("NUM\n");}
| STR {printf("STR\n");}
;
%%
, मैं एक गैर टर्मिनल परिभाषित की जरूरत है एक कार्यक्रम के रूप में, जिस पर पूरा पार्स पेड़ लटका सकता है। लेकिन मैंने कोशिश की और यह काम नहीं कर रहा था। -
संपादित करें यह मेरी "शीर्ष टर्मिनल" दृष्टिकोण था:
program: slist;
slist: slist sexpr | sexpr;
लेकिन यह इस तरह के रूप समस्याओं अनुमति देता है:
(1 1
EDIT2: FLEX कोड है ...
%{
#include <stdio.h>
#include "a.yacc.tab.h"
int linenumber;
extern int yylval;
%}
%%
\n { linenumber++; }
[0-9]+ { yylval = atoi(yytext); return NUM; }
\"[^\"\n]*\" { return STR; }
[a-zA-Z][a-zA-Z0-9]* { return ID; }
.
%%
से अधिक मिलान का एक उदाहरण ...
(1 1 1)
NUM
matched sexpr
NUM
matched sexpr
NUM
matched sexpr
(1 1
NUM
matched sexpr
NUM
matched sexpr
यहां क्या त्रुटि है?
संपादित करें: त्रुटि lexer में थी।
क्या अपने उत्पादन जब यह पार्स करता है (1 1 कैसा दिखता है मैं कैसे इसके बारे में एक बात करने के लिए हो जाता है नहीं देख सकते हैं? बंद होने की उम्मीद नहीं है)। – Bearddo
क्या आप अपनी लेक्स/फ्लेक्स फ़ाइल भी पोस्ट कर सकते हैं? शायद एक त्रुटि है। साथ ही, आपको वर्णों का उपयोग नहीं करना चाहिए ('व्याकरण में यदि आप लेक्सर का उपयोग करते हैं, तो मुझे सच में यकीन नहीं है कि ये कैसे साथ आते हैं। – jpalecek
क्या अजीब बात यह है कि वैध सूची (1 1 1) भी नहीं आती है एक सूची के लिए एक मैच। मैं दो चीजों की कोशिश करता हूं, पहले सदस्यों को रिकर्सिव छोड़ देता है: सदस्य: सदस्य sexpr | sexpr; दूसरा, sexpr में सूची का क्रम स्वैप करें: सूची | परमाणु; देखें कि यह काम करता है। – Bearddo