2010-05-12 17 views
5
val uninterestingthings = ".".r 
val parser = "(?ui)(regexvalue)".r | (uninterestingthings~>parser) 

यह रिकर्सिव पार्सर इनपुट के अंत तक "(? Ui) (regexvalue)" आर को पार्स करने का प्रयास करेगा। स्कैला में पार्सिंग को प्रतिबंधित करने का एक तरीका है जब कुछ परिभाषित संख्याओं को "अनिच्छुक" द्वारा खपत किया जाता है?स्केल में रिकर्सिव पार्सर का उन्नत नियंत्रण

युपीडी: मैं एक गरीब समाधान है:

object NonRecursiveParser extends RegexParsers with PackratParsers{ 
    var max = -1 
    val maxInput2Consume = 25 
    def uninteresting:Regex ={ 
    if(max<maxInput2Consume){ 
    max+=1 
    ("."+"{0,"+max.toString+"}").r 
    }else{ 
     throw new Exception("I am tired") 
    } 
    } 
    lazy val value = "itt".r 
    def parser:Parser[Any] = (uninteresting~>value)|parser 
    def parseQuery(input:String) = { 
     try{ 
     parse(parser, input) 
     }catch{ 
      case e:Exception => 
     } 
    } 
} 

नुकसान:
- नहीं सभी सदस्यों आलसी Vals हैं तो PackratParser कुछ समय होगा जुर्माना
- हर "नीरस" विधि कॉल पर regexps निर्माण - समय जुर्माना
- प्रोग्राम को नियंत्रित करने के लिए अपवाद का उपयोग - कोड शैली और समय जुर्माना

+0

आप इस समस्या को अन्य पार्सर पुस्तकालयों, जेनरेटर या ढांचे के साथ कैसे हल करेंगे? –

+0

आप वास्तव में क्या करने की कोशिश कर रहे हैं? –

उत्तर

3

त्वरित-एन-गंदे उत्तर केवल आपके रेगेक्स में वर्णों की संख्या को सीमित करने के लिए सीमित करना है और यह पुनरावर्ती नहीं करते हैं:

val uninterestingthings = ".{0,60}".r // 60-chars max 
val parser = (uninterestingthings~>"(?ui)(regexvalue)".r)* 

लालच के बारे में टिप्पणी के आधार पर regexvalue खाने, मैं एक ही regex का प्रस्ताव:

val parser = ("(?.{0,60}?)(?ui)(regexvalue)".r)* 

लेकिन हम स्केला के दायरे बाहर कदम गए हैं लगता है Regex minutia में पार्सर्स। मुझे अन्य परिणाम देखने में दिलचस्पी होगी।

+0

यह काम नहीं करेगा क्योंकि "अनिच्छुकता" लालची है और हमेशा इनपुट के 60 वर्णों का उपभोग करेगी – Jeriho

0

दिलचस्प चीज़ों के लिए सभी regexps का उपयोग करके, पहले चीजों को तोड़ने के लिए टोकननाइज़र का उपयोग करें। यदि वे आपके व्याकरण के लिए महत्वपूर्ण हैं तो अनैतिक चीज़ों से मेल खाने के लिए एक ".".r का उपयोग करें। (या उन्हें फेंक दें यदि वे व्याकरण के लिए महत्वपूर्ण नहीं हैं।) आपकी रोचक चीजें अब ज्ञात प्रकार हैं, और उन्हें पार्सिंग की तुलना में एक अलग एल्गोरिदम का उपयोग करके टोकनज़र द्वारा पहचाना जाता है। चूंकि सभी लुकहेड समस्याओं को टोकननाइज़र द्वारा हल किया जाता है, इसलिए पार्सर आसान होना चाहिए।

संबंधित मुद्दे