core: Debug wrapper for handleParserIO
This commit is contained in:
parent
5a47d5548c
commit
06c4c8a9cf
2 changed files with 48 additions and 0 deletions
|
@ -116,6 +116,13 @@ runFirstIO f str = do
|
||||||
| _ => pure . Left $ BeforeParse "Empty input"
|
| _ => pure . Left $ BeforeParse "Empty input"
|
||||||
runEff (rundownFirst f) [handleParserStateIO state]
|
runEff (rundownFirst f) [handleParserStateIO state]
|
||||||
|
|
||||||
|
export
|
||||||
|
runFirstIODebug : (f : Parser a) -> String -> IO (Either ParseError a)
|
||||||
|
runFirstIODebug f str = do
|
||||||
|
Just state <- newInternalIO str
|
||||||
|
| _ => pure . Left $ BeforeParse "Empty input"
|
||||||
|
runEff (rundownFirst f) [handleParserStateIODebug state]
|
||||||
|
|
||||||
export
|
export
|
||||||
runFirst : (f : Parser a) -> String -> Eff fs (Either ParseError a)
|
runFirst : (f : Parser a) -> String -> Eff fs (Either ParseError a)
|
||||||
runFirst f str = do
|
runFirst f str = do
|
||||||
|
|
|
@ -12,6 +12,9 @@ import public Data.Refined.Int64
|
||||||
import public Data.SortedMap
|
import public Data.SortedMap
|
||||||
import public Data.IORef
|
import public Data.IORef
|
||||||
|
|
||||||
|
import Data.Primitives.Interpolation
|
||||||
|
import System.File
|
||||||
|
|
||||||
import public Control.Eff
|
import public Control.Eff
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -49,11 +52,17 @@ record Index (length : Int64) where
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- idris
|
<!-- idris
|
||||||
|
export
|
||||||
Eq (Index i) where
|
Eq (Index i) where
|
||||||
x == y = x.index == y.index
|
x == y = x.index == y.index
|
||||||
|
|
||||||
|
export
|
||||||
Ord (Index i) where
|
Ord (Index i) where
|
||||||
compare x y = compare x.index y.index
|
compare x y = compare x.index y.index
|
||||||
|
|
||||||
|
export
|
||||||
|
Show (Index i) where
|
||||||
|
show (MkIndex index) = show index
|
||||||
-->
|
-->
|
||||||
|
|
||||||
Stores the location we are currently at in the string, and metadata about it for
|
Stores the location we are currently at in the string, and metadata about it for
|
||||||
|
@ -147,6 +156,17 @@ positionPair pi =
|
||||||
in (linum, col)
|
in (linum, col)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
<!-- idris
|
||||||
|
export
|
||||||
|
Show (ParserInternal Id) where
|
||||||
|
show pi =
|
||||||
|
let (line, col) = positionPair pi
|
||||||
|
current = assert_total $ strIndex pi.input (cast pi.position.index)
|
||||||
|
pos = pi.position.index
|
||||||
|
eof = show pi.end_of_input
|
||||||
|
in "Position: \{pos}(\{line}, \{col}}) Value: \{show current} EoF: \{eof}"
|
||||||
|
-->
|
||||||
|
|
||||||
### More Barbie Functionality
|
### More Barbie Functionality
|
||||||
|
|
||||||
Provide the barbie analogs of `map` and `traverse` for our `ParserInternal`
|
Provide the barbie analogs of `map` and `traverse` for our `ParserInternal`
|
||||||
|
@ -195,6 +215,14 @@ data ParserState : Type -> Type where
|
||||||
ParseEoF : ParserState Bool
|
ParseEoF : ParserState Bool
|
||||||
```
|
```
|
||||||
|
|
||||||
|
<!-- idris
|
||||||
|
Show (ParserState t) where
|
||||||
|
show Save = "Saving state"
|
||||||
|
show (Load pi) = "Loading state \{show pi}"
|
||||||
|
show (ParseChar predicate err) = "Parsing char"
|
||||||
|
show ParseEoF = "Parsing EoF"
|
||||||
|
-->
|
||||||
|
|
||||||
### Actions
|
### Actions
|
||||||
|
|
||||||
```idris
|
```idris
|
||||||
|
@ -281,6 +309,19 @@ newInternalIO str = do
|
||||||
map Just $ newIORef internal
|
map Just $ newIORef internal
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Wrapper with debugging output
|
||||||
|
|
||||||
|
```idris
|
||||||
|
export
|
||||||
|
handleParserStateIODebug : HasIO io =>
|
||||||
|
IORef (ParserInternal IORef) -> ParserState t -> io t
|
||||||
|
handleParserStateIODebug x y = do
|
||||||
|
state <- readIORef x
|
||||||
|
state <- btraverse readIORef state
|
||||||
|
_ <- fPutStrLn stderr "\{show y} -> \{show state}"
|
||||||
|
handleParserStateIO x y
|
||||||
|
```
|
||||||
|
|
||||||
### State context
|
### State context
|
||||||
|
|
||||||
```idris
|
```idris
|
||||||
|
|
Loading…
Add table
Reference in a new issue