2012-11-02 13 views
5

हाय मैं इस तरह व्याकरण के साथ एक सरल भाषा के लिए एक पार्सर को लागू करने की कोशिश कर रहा हूँ।पार्सर कार्यान्वयन

program ::= "program" declarations "begin" statements "end" 
declaration ::= "var" ident "as" type 
type ::= "string" | "int" 

मेरे पहले दो किए गए हैं, मैं व्याकरण प्रकार कैसे लिखूं?

program(prog(DECLS, STATS)) --> 
[ 'program' ], declarations(DECLS), 
[ 'begin' ], statements(STATS), [ 'end' ]. 

declaration(decl(IDENT, TYPE)) --> 
[ 'var' ], ident(IDENT), [ 'as' ], type(TYPE). 
+0

it..I बस में व्याकरण संपादन कर रहा हूँ परीक्षण करने के लिए जब मैं उपरोक्त नियमों मैं SICStus का उपयोग किया जाएगा के साथ व्याकरण बदल एक .sp फ़ाइल – user1794576

+0

खेद हाँ prolog – user1794576

उत्तर

2
type(string) --> ['string']. 
type(int) --> ['int']. 

(वास्तव में ' की आवश्यकता नहीं है)

आप | या ; इस्तेमाल कर सकते हैं लेकिन यह है कि जिस तरह से आप प्रकार आप पाया वापसी को मुश्किल होगा।

+0

में है कि वास्तव में है क्या मैं धन्यवाद – user1794576

+0

मैं भी इस assign_stmt :: = अध्यक्ष ऑपरेटर expr आप मदद कर सकते हैं करने के लिए कोशिश कर रहा हूँ के लिए देख रहा था के साथ वर्डपैड? – user1794576

+0

@ user1794576 बहुत सरल लगता है; 'assign_stmt (...): - पहचान (...), ऑपरेटर (...), expr (...)। 'अभिव्यक्तियों के लिए आपको अपने व्याकरण से बाएं रिकर्सन को हटा देना चाहिए: https: //en.wikipedia .org/wiki/Left_recursion # Removing_left_recursion –

2

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

आपके मामले में, "varaasint" मान्य घोषणा है? आपका व्याकरण इसका सुझाव देता है। या आपको "var a int int" लिखना है।

आप this answer for more में देखना चाहते हो सकता है।

1

आप statements नियम याद आती है!

वैसे भी, DCG नियम Prolog पर सादे वाक्य रचना चीनी कर रहे हैं, तो आप किसी भी Prolog सुविधा आप की तरह उपयोग कर सकते हैं। आप व्याकरण कॉम्पैक्ट रखने के लिए की जरूरत है:

type(type(T)) --> [T], {memberchk(T, [int, string])}. 

ब्रेसिज़ व्याकरण के नियमों के साथ सामान्य Prolog मिश्रण करने की अनुमति है।

जैसा @false ने नोट किया है, आपका व्याकरण केवल तभी उपयोगी होता है जब आपके पास टोकननाइज़र होता है, जो आपके इनपुट को विभाजित करता है और व्हाइटस्पेस को छोड़ देता है। या आप अधिक सीधे संभाल सकता है कि, इस स्कीमा (सावधान रहना, अपरीक्षित कोड) का उपयोग:

program(prog(DECLS, STATS)) --> 
    s, "program", s, declarations(DECLS), 
    s, "begin", s, statements(STATS), s, "end", s. 

declaration(decl(IDENT, TYPE)) --> 
    "var", s, ident(IDENT), s, "as", s, type(TYPE). 

declarations([D|Ds]) --> declaration(D), declarations(Ds). 
declarations([]) --> []. 

type(type(int)) --> "int". 
type(type(string)) --> "string". 

% skip 1 or more whitespace 
s --> (" " ; "\n"), (s ; []). 
संबंधित मुद्दे