val uninterestingthings = ".".r
val parser = "(?ui)(regexvalue)".r | (uninterestingthings~>parser)
Trình phân tích cú pháp đệ quy này sẽ cố gắng phân tích cú pháp "(? Ui) (regexvalue)". R cho đến khi kết thúc đầu vào. Là trong scala một cách để ngăn chặn phân tích cú pháp khi một số xác định số ký tự đã được tiêu thụ bởi "uninterestingthings"?Kiểm soát nâng cao trình phân tích đệ quy trong scala
UPD: Tôi có một giải pháp nghèo:
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 =>
}
}
}
Nhược điểm:
- không phải tất cả các thành viên là Vals lười biếng vì vậy PackratParser sẽ có một thời gian hình phạt
- xây dựng regexps trên mỗi "không thú vị" phương pháp gọi - hình phạt thời gian
- sử dụng ngoại lệ để kiểm soát kiểu chương trình - mã và hình phạt thời gian
Bạn sẽ giải quyết vấn đề này như thế nào với các thư viện, trình tạo hoặc khung công cụ phân tích cú pháp khác? –
Bạn đang thực sự cố gắng làm gì? –