संपादित करें:

मेरा नीचे का प्रश्न अभी भी खड़ा है लेकिन मैं सराहना करता हूं कि कोड के ढेर के बिना उत्तर देना मुश्किल है। इसलिए, कुछ इसी तरह का प्रश्न पूछने के लिए, क्या किसी के पास एएसटी को लागू करने के लिए मेन्हिर का उपयोग किए जाने का कोई उदाहरण है? अधिमानतः कैलकुलेटर की तरह "खिलौना" प्रोजेक्ट नहीं, लेकिन मुझे जो भी मदद मिल सकती है, मैं उसकी सराहना करूंगा।

मूल प्रश्न:

मैं मेनहिर का उपयोग करके एक सार वाक्यविन्यास पेड़ को लागू करने की कोशिश कर रहा हूं और एक समस्या है जिसे मैं हल नहीं कर सकता। मेरा सेट अप इस प्रकार है:

  • AST का विनिर्देश atdgen का उपयोग करके तैयार किया गया है। यह मूल रूप से एक फ़ाइल है जिसमें मेरे सभी व्याकरण नियमों का एटीडी प्रारूप में अनुवाद किया गया है। यह मुझे कुछ JSON को क्रमबद्ध करने की अनुमति देता है जो कि मैं AST का प्रिंट आउट लेने के लिए उपयोग करता हूं।
  • मेरी parser.mly फ़ाइल में मेरे पास उत्पादन की एक लंबी सूची है। जैसा कि मैं मेनहिर का उपयोग कर रहा हूं, मैं इन प्रस्तुतियों को एएसटी नोड निर्माण तक जोड़ सकता हूं, यानी पार्सर से प्रत्येक उत्पादन एएसटी में एक मूल्य रिकॉर्ड करने के निर्देश से मेल खाता है।

दूसरा बिंदु वह है जहां मैं वास्तव में प्रगति करने के लिए संघर्ष कर रहा हूं। मेरे पास एक बड़ा व्याकरण है (ast.atd फ़ाइल ~ 600 लाइन लंबी है और parser.mly फ़ाइल ~ 1000 फ़ाइलें लंबी है) इसलिए यह पता लगाना मुश्किल है कि मैं कहां गलत हो रहा हूं। मुझे संदेह है कि मेरे पास रास्ते में कहीं एक प्रकार की त्रुटि है।

कोड के अंश

यहाँ मेरी ast.atd फ़ाइल कैसी दिखती है:

    ...
type star = [ Star ]

type equal = [ Equal ]

type augassign = [
  | Plusequal
  | Minequal
  | Starequal
  | Slashequal
  | Percentequal
  | Amperequal
  | Vbarequal
  | Circumflexequal
  | Leftshiftequal
  | Rightshiftequal
  | Doublestarequal
  | Doubleslashequal
]
    ...

यहाँ मेरी parser.mly फ़ाइल कैसी दिखती है:

    ...
and_expr // Used in: xor_expr, and_expr
    : shift_expr
        { $1 }
    | and_expr AMPERSAND shift_expr
        { `And_shift ($1, `Ampersand, $3) } ;

shift_expr // Used in: and_expr, shift_expr
    : arith_expr
        { $1 }
    | shift_expr pick_LEFTSHIFT_RIGHTSHIFT arith_expr
        { `Shift_pick_arith ($1, $2, $3) } ;

pick_LEFTSHIFT_RIGHTSHIFT // Used in: shift_expr
    : LEFTSHIFT
        { `Leftshift }
    | RIGHTSHIFT
        { `Rightshift } ;
    ...

जब मैं फ़ाइलों को संकलित करने का प्रयास करता हूं तो मुझे त्रुटि मिलती है

ocamlbuild -use-menhir -tag thread -use-ocamlfind -quiet -pkgs
    'core,yojson,atdgen' main.native

एक प्रकार की त्रुटि है, अर्थात।

This expression has type [GIANT TYPE CONSTRUCTION] but an expression
    was expected of type [DIFFERENT GIANT TYPE CONSTRUCTION]

मुझे एहसास है कि इस तरह के सार में इस सवाल का जवाब देना कुछ मुश्किल है, और मुझे अपने कोड के ड्रॉपबॉक्स के लिए एक लिंक प्रदान करने में खुशी हो रही है, लेकिन अगर कोई मुझे सही दिशा में इंगित कर सकता है तो मैं वास्तव में सराहना करता हूं।

संभावित रूप से रुचि: मेरे पास parser.mly में कुछ प्रोडक्शंस हैं जो शुरू में "खाली" थे जिन्हें मैंने ocaml option प्रकार (Some और None) का उपयोग करके निपटाया था। शायद मुझे यहाँ समस्या हो रही है?

0
daire16 20 मार्च 2017, 18:57
क्या आप पुराने प्रश्न को हटा सकते हैं और यदि आवश्यक हो तो इसे किसी अन्य प्रश्न में पूछ सकते हैं? इससे लोगों को मेनहिर उदाहरणों के बारे में उत्तर खोजने में मदद मिलेगी।
 – 
Étienne Millon
20 मार्च 2017, 19:59

1 उत्तर

सबसे बढ़िया उत्तर

menhir का उपयोग करने वाले कोड के उदाहरणों के बारे में, आप OPAM मेनहिर पेज - ये सभी menhir पर निर्भर करते हैं।

1
Étienne Millon 20 मार्च 2017, 19:59
दुर्भाग्य से मैनुअल "खिलौना" कार्यक्रमों के दायरे से परे कोई उदाहरण नहीं देता है (वे सभी कैलकुलेटर हैं जो मुझे विश्वास है)। जो मैं खोज रहा हूं वह कुछ अधिक परिष्कृत है, शायद पूर्ण भाषा कार्यान्वयन नहीं बल्कि उस पैमाने के करीब कुछ।
 – 
daire16
20 मार्च 2017, 20:11
मेरा मतलब था "के लिए आवश्यक" सूची - इसमें उदाहरण के लिए सीसीएसएस शामिल है, जिसमें मेनहिर पार्सर
 – 
Étienne Millon
20 मार्च 2017, 20:28
1
ओह वाह, यह वही है जो मैं ढूंढ रहा था, धन्यवाद दस लाख! पहले न समझ पाने के लिए माफ़ी चाहता हूँ।
 – 
daire16
20 मार्च 2017, 20:38