Một số nền trước tiên. Tôi hiện đang học một số thứ về bộ phối hợp phân tích cú pháp đơn thuần. Trong khi tôi cố gắng để chuyển chức năng 'chainl1' từ this paper (. P 16-17), tôi đã đưa ra giải pháp này:Chức năng đệ quy trong biểu thức tính toán
let chainl1 p op = parser {
let! x = p
let rec chainl1' (acc : 'a) : Parser<'a> =
let p' = parser {
let! f = op
let! y = p
return! chainl1' (f acc y)
}
p' <|> succeed acc
return! chainl1' x
}
Tôi đã thử nghiệm chức năng với một số đầu vào lớn và có một StackOverflowException. Bây giờ tôi tự hỏi, là nó posible để viết lại một chức năng đệ quy, mà sử dụng một số biểu thức tính toán, trong một cách để nó được sử dụng đệ quy đuôi?
Khi tôi mở rộng biểu thức tính toán, tôi không thể nhìn thấy cách nói chung có thể.
let chainl1 p op =
let b = parser
b.Bind(p, (fun x ->
let rec chainl1' (acc : 'a) : Parser<'a> =
let p' =
let b = parser
b.Bind(op, (fun f ->
b.Bind(p, (fun y ->
b.ReturnFrom(chainl1' (f acc y))))))
p' <|> succeed acc
b.ReturnFrom(chainl1' x)))
Điều này sẽ loại bỏ các đệ quy thông qua mã người dùng, nhưng trong thực hiện của tôi ở đây http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!1772.hãy tiếp tục StackOverflows thông qua việc thực hiện trình phân tích cú pháp. Bây giờ tôi sẽ có động lực để điều tra 'các trình phân tích cú pháp với sự tiếp tục' ... – Brian
FParsec http://www.quanttec.com/fparsec/ có xử lý việc này không? – Brian
Brian, tôi cũng sử dụng chuỗi blog của bạn như một nguồn học tập. Nó đã giúp rất nhiều. Trong khi đó, tôi so sánh câu trả lời của Mau ('seq') với trình phân tích cú pháp của tôi. Và tôi đoán phương thức Delay trong đơn nguyên là nhập. Nhưng tôi thực sự không biết. FParsec sử dụng 'while' ... nhưng tôi muốn sử dụng một giải pháp chức năng: D – PetPaulsen