मैंने आपकी भाषा को एक .rb फ़ाइल में संकलित करने के लिए treetop से पूछा। यही कारण है कि मुझे खुदाई करने के लिए कुछ दे दी है में:
require 'treetop'
load '/tmp/rip.rb'
RipParser.new.parse('')
यह लटकी हुई है:
$ tt -o /tmp/rip.rb /tmp/rip.treetop
तब मैं पाश पुन: बनाने के लिए इस छोटे से ठूंठ इस्तेमाल किया। अब, वह दिलचस्प नहीं है! एक खाली स्ट्रिंग आपके प्रश्न में व्यवहार के साथ-साथ दर्जन-या-रेखा उदाहरण को पुन: उत्पन्न करती है।
यह पता लगाने के लिए कि यह कहां लटक रहा है, मैंने rip.rb को संपादित करने के लिए एक Emacs कीबोर्ड मैक्रो का उपयोग किया, प्रत्येक विधि के प्रवेश में एक डीबग कथन जोड़ना। उदाहरण के लिए: वहाँ से पता चलता है कि एक पूर्णांक को खाली स्ट्रिंग के लिए अनुमति दी है
[16, "root"]
[21, "_nt_root"]
[57, "_nt_statement"]
...
[3293, "_nt_eol"]
[3335, "_nt_semicolon"]
[3204, "_nt_comment"]
[57, "_nt_statement"]
[57, "_nt_statement"]
[57, "_nt_statement"]
...
इसके अलावा डिबगिंग:
rule integer
digit*
end
def _nt_root
p [__LINE__, '_nt_root'] #DEBUG
start_index = index
अब हम पाश के दायरे देख सकते हैं यह अप्रत्यक्ष रूप से एक कथन को खाली स्ट्रिंग होने की अनुमति देता है, और शीर्ष-स्तरीय नियम statement*
हमेशा खाली बयान का उपभोग करने के लिए अनुमति देता है। पाश *
+
को ठीक करता है बदल रहा है, लेकिन एक और समस्या का पता चलता है:
/tmp/rip.rb:777:in `_nt_object': stack level too deep (SystemStackError)
from /tmp/rip.rb:757:in `_nt_compound_object'
from /tmp/rip.rb:1726:in `_nt_range'
from /tmp/rip.rb:1671:in `_nt_special_literals'
from /tmp/rip.rb:825:in `_nt_literal_object'
from /tmp/rip.rb:787:in `_nt_object'
from /tmp/rip.rb:757:in `_nt_compound_object'
from /tmp/rip.rb:1726:in `_nt_range'
from /tmp/rip.rb:1671:in `_nt_special_literals'
... 3283 levels...
रेंज बाएं recursing है, परोक्ष रूप से, special_literals, literal_object, वस्तु, और compound_object के माध्यम से। ट्रीटॉप, जब बाएं रिकर्सन का सामना करना पड़ता है, तब तक ढेर खा जाता है जब तक कि यह पुक न हो जाए। मेरे पास उस समस्या के लिए त्वरित समाधान नहीं है, लेकिन कम से कम आपको अब से जाने के लिए एक स्टैक ट्रेस मिला है।
इसके अलावा, यह आपकी तत्काल समस्या नहीं है, लेकिन digit
की परिभाषा विषम है: यह या तो एक अंक या एकाधिक हो सकती है। यह digit*
या digit+
का कारण बनता है (संभावित रूप से) अवैध पूर्णांक 1________2
।
मैंने पहले पांच या छह ट्यूटोरियल वीडियो देखे, लेकिन अब तक मैं साथ में काम करने के लिए एक सेटअप सेटअप नहीं कर पा रहा हूं। आप सही हैं कि वह बहुत तेजी से शुरू नहीं होता है। मैं एएनटीएलआर को एक और कोशिश दूंगा। – ravinggenius
@ रैविंग, ठीक है, मुझे आपके 'ट्रीटॉप' व्याकरण की पसंद पसंद आया, और यदि आप रूबी में प्रोग्राम करना चाहते थे, तो एएनटीएलआर में स्विच करने से ज्यादा मदद नहीं मिलेगी। :) मैंने सोचा कि उनकी पुस्तक ने एक अच्छा काम किया है कि अच्छे पार्सर्स का निर्माण कैसे किया जाए, और एएनटीएलआर वह टूल था जिसे वह उपयोग करना चुनता था। – sarnold