Tôi đang phân tích một biểu thức bằng Parsec và tôi muốn theo dõi các biến trong các biểu thức này bằng cách sử dụng trạng thái người dùng trong Parsec. Thật không may tôi không thực sự có được làm thế nào để làm điều đó.Trạng thái người dùng trong Parsec
Với đoạn mã sau:
import Data.Set as Set
inp = "$x = $y + $z"
data Var = V String
var = do char '$'
n <- many1 letter
let v = Var n
-- I want to modify the set of variables here
return v
parseAssignment = ... -- parses the above assignment
run = case runIdentity $ runParserT parseAssignment Set.empty "" inp of
Left err -> ...
Right -> ...
Vì vậy, u
trong ParsecT s u m a
sẽ Set.Set
. Nhưng làm thế nào tôi sẽ tích hợp cập nhật trạng thái vào var
?
Tôi đã thử một cái gì đó như modify $ Set.insert v
, nhưng điều này không hiệu quả, vì Set.Set
không phải là một đơn vị trạng thái.
Cảm ơn! Đó là chính xác những gì tôi cần - có thể đã nhìn vào chức năng đó trước đó ... Tôi bằng cách nào đó nghĩ modifyState có liên quan đến sửa đổi từ Control.Monad.State. – bzn
@ bzn: Nó có liên quan, mặc dù! Nếu bạn nghĩ rằng Parsec là một nhà nước duy nhất chỉ giữ trạng thái người dùng, họ cũng làm như vậy. Chúng chỉ khác nhau vì 'modifyState' bỏ qua trạng thái bên trong của Parsec. –