2011-01-06 20 views
5

ऐसा लगता है जैसे स्कैला के पार्सर संयोजक बैकट्रैक नहीं करते हैं।स्कैला पार्सर संयोजकों में बैकट्रैकिंग?

copy in to out . 

कि बैक ट्रैकिंग के साथ पार्स करने के लिए आसान होना चाहिए:: मैं एक व्याकरण (नीचे देखें) जो निम्नलिखित "stmt" सही ढंग से पार्स नहीं कर सकता है

stmt: (to out(copy in)) 

या मैं कुछ याद आ रही है?

पार्सर:

type ExprP = Parser[Expr] 
type ValueP = Parser[ValExpr] 
type CallP = Parser[Call] 
type ArgsP = Parser[Seq[Expr]] 

val ident  = "[a-zA-Z\\+\\-\\*/%><\\\\\\=]+".r 
val sqstart = "\\["       .r 
val sqend  = "\\]"       .r 
val del  = ","       .r 
val end  = "\\."       .r 

def stmt: ExprP  = expr <~ end 
def expr: ExprP  = ucall | call | value 
def value: ValueP = ident ^^ {str => IdentExpr(str)} 
def call: CallP  = (args ~ ident ~ expr) ^^ {case args ~ method ~ upon => Call(args, method, upon)} 
def ucall: CallP  = (ident ~ expr) ^^ {case method ~ upon => Call(Seq(), method, upon)} 
def args: ArgsP  = advargs | smplargs 
def smplargs: ArgsP = expr ^^ {e => Seq(e)} 
def advargs: ArgsP = (sqstart ~> repsep(expr, del) <~ sqend) ^^ {seq => seq} 
+0

इसे काम करने के करीब मिला, अब मुझे एक ढेर ओवरफ्लो मिलता है। अद्यतन पार्सर। – Anonymous

उत्तर

4

आप 2.8 में PackratParsers उपयोग करना चाहते हैं। मुझे लगता है कि पैक्रेट पार्सर एकमात्र बैकट्रैकिंग पार्सर है।

संपादित करें: मध्य वर्ष 2015 तक, आपको इसके बजाय fastparse का उपयोग करना चाहिए। यह न केवल बहुत तेज़ है, बल्कि उपयोग करना भी आसान है (विशेष रूप से जब पार्सिंग से डेटा संरचनाएं बनाते हैं)।

+0

ऐसा लगता है कि यह ठीक नहीं है; मुझे अभी भी एसओ (बाएं-रिकर्सिव व्याकरण होने से) मिलता है, और मैंने सुना है कि पैट्रेट-पार्सिंग इसे ठीक करने में सक्षम होना चाहिए। यदि मैं इसे कॉल से पहले मूल्यों का विश्लेषण करता हूं, तो यह पार्स नहीं करेगा (कोई बैकट्रैकिंग नहीं है?)। हो सकता है कि मैंने पैक्रेट पार्सिंग को सक्रिय नहीं किया है, लेकिन मैंने पैकट्रैपर्स में मिश्रण करना और सभी कार्यों से पाकतपर्सर को वापस करना सुनिश्चित किया है। क्या आप PackratParsers के बारे में कुछ जानते हैं? – Anonymous

+1

ओह, ठीक है, अब मुझे यह मिला। आप सभी को जो पैट्रेट-पार्सर्स की ज़रूरत है: "आलसी" को "आलसी वैल" के साथ प्रतिस्थापित करना याद रखें, "पार्सर [टी]" को "पैट्रैटपार्सर [टी]" के साथ बदलें और पार्सर्स-क्लास/ऑब्जेक्ट मिक्स-इन को पैट्रैटपार्स से बनाएं। – Anonymous

+0

@ अनामित कृपया अपने अंतिम निर्देश पर अधिक स्पष्ट रहें: "पैकर्सपार्स से पार्सर्स-क्लास/ऑब्जेक्ट मिश्रण-इन करें"। क्या यह कक्षा के लिए बस "पैट्रेटपार्सर्स के साथ" है? – javadba

3

आपकी समस्या बैकट्रैकिंग नहीं है। scala.util.parsing.combinator में मानक | ऑपरेटर बैकट्रैकिंग करेगा। आपकी समस्या बाएं-रिकर्सन (exprcallargssmplargsexpr) है। पैट्रेट पार्सिंग वास्तव में उसमें मदद कर सकती है।

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