संपादित करें:
मेरा नीचे का प्रश्न अभी भी खड़ा है लेकिन मैं सराहना करता हूं कि कोड के ढेर के बिना उत्तर देना मुश्किल है। इसलिए, कुछ इसी तरह का प्रश्न पूछने के लिए, क्या किसी के पास एएसटी को लागू करने के लिए मेन्हिर का उपयोग किए जाने का कोई उदाहरण है? अधिमानतः कैलकुलेटर की तरह "खिलौना" प्रोजेक्ट नहीं, लेकिन मुझे जो भी मदद मिल सकती है, मैं उसकी सराहना करूंगा।
मूल प्रश्न:
मैं मेनहिर का उपयोग करके एक सार वाक्यविन्यास पेड़ को लागू करने की कोशिश कर रहा हूं और एक समस्या है जिसे मैं हल नहीं कर सकता। मेरा सेट अप इस प्रकार है:
- 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
) का उपयोग करके निपटाया था। शायद मुझे यहाँ समस्या हो रही है?
1 उत्तर
menhir
का उपयोग करने वाले कोड के उदाहरणों के बारे में, आप OPAM मेनहिर पेज - ये सभी menhir
पर निर्भर करते हैं।
संबंधित सवाल
नए सवाल
json
JSON (जावास्क्रिप्ट ऑब्जेक्ट नोटेशन) मशीन और मानव पठनीय होने के लिए एक क्रमबद्ध डेटा इंटरचेंज प्रारूप है। इस टैग का उपयोग देशी जावास्क्रिप्ट वस्तुओं या जावास्क्रिप्ट ऑब्जेक्ट शाब्दिकों के लिए न करें। इससे पहले कि आप कोई प्रश्न पूछें, एक JSON सत्यापनकर्ता जैसे JSONLint (https://jsonlint.com) का उपयोग करके अपने JSON को मान्य करें।