मैं आमतौर पर end_of_line के लिए नियम परिभाषित करता हूं। यह end_of_file से मेल खाने के लिए http://kschiess.github.io/parslet/tricks.html में चाल पर आधारित है।
class MyParser < Parslet::Parser
rule(:cr) { str("\n") }
rule(:eol?) { any.absent? | cr }
rule(:line_body) { (eol?.absent? >> any).repeat(1) }
rule(:line) { cr | line_body >> eol? }
rule(:lines?) { line.repeat (0)}
root(:lines?)
end
puts MyParser.new.parse(""" this is a line
so is this
that was too
This ends""").inspect
जाहिर है अगर आप पार्सर से आप स्ट्रिंग के साथ प्राप्त कर सकते हैं :: विभाजन ("\ n") के साथ और अधिक करना चाहते हैं आप उपयोगी कुछ :)
मैं साथ line_body
का स्थान ले लेगा इस सवाल का जवाब देने के लिए जल्दी चले गए और इसे उलझा लिया। मैं बस अपनी गलती की व्याख्या करता हूं, और आपको दिखाता हूं कि उस तरह की गलतियों से कैसे बचें।
मेरा पहला जवाब यहां है।
rule(:eol) { str('\n') | any.absent? }
rule(:line) { (eol.absent? >> any).repeat >> eol }
rule(:lines) { line.as(:line).repeat }
मैं अपने सामान्य नियमों का पालन नहीं किया:
- हमेशा दोहराने गिनती स्पष्ट
- किसी भी नियम है कि शून्य लम्बाई तार मिलान कर सकते हैं, नाम एक में समाप्त होने वाले होना चाहिए बनाने के '?'
तो लागू इन ...
rule(:eol?) { str('\n') | any.absent? }
# as the second option consumes nothing
rule(:line?) { (eol.absent? >> any).repeat(0) >> eol? }
# repeat(0) can consume nothing
rule(:lines?) { line.as(:line?).repeat(0) }
# We have a problem! We have a rule that can consume nothing inside a `repeat`!
यहाँ देख कारण है कि हम एक अनंत लूप प्राप्त करने देता है। चूंकि इनपुट का उपभोग होता है, तो आप केवल end of file
के साथ समाप्त होते हैं, जो eol?
से मेल खाता है और इसलिए line?
(जैसा कि लाइन बॉडी खाली हो सकता है)। lines
'repeat
के अंदर होने के नाते, यह हमेशा के लिए कुछ भी और लूप खाने के बिना मेल खाता रहता है।
हमें लाइन नियम बदलने की जरूरत है ताकि यह हमेशा कुछ खा सके।
rule(:cr) { str('\n') }
rule(:eol?) { cr | any.absent? }
rule(:line_body) { (eol.absent? >> any).repeat(1) }
rule(:line) { cr | line_body >> eol? }
rule(:lines?) { line.as(:line).repeat(0) }
अब line
, या तो एक cr
(खाली लाइनों के लिए), या कम से कम एक चरित्र वैकल्पिक eol?
के बाद कुछ मेल खाना चाहिए। सभी repeat
के पास ऐसे शरीर हैं जो कुछ उपभोग करते हैं। अब हम सुनहरे हैं।
स्रोत
2013-07-24 00:11:35
यह एक अच्छा समाधान की तरह दिखता है। मेरा कामकाज अंत में मैच विफलता को रोकने के लिए '\ n' के साथ भी काम करना था और आने वाली स्ट्रिंग में एक नई लाइन जोड़ने के लिए था। हालांकि, यह क्लीनर दिखता है। धन्यवाद! – Danyel