FParsec에서 균등 json 형 배열을 구문 분석하는 데 문제가 있습니다. 문제를 재현 한 짧은 예제로 분해했습니다. 내가 P_INT_VALUE
및 P_BOOL_VALUE
<|>
연산자를 사용하여 순서를 바꿀 경우FParsec에서 균등리스트를 어떻게 파싱 할 수 있습니까?
test P_LIST_VALUE "[1,2,3]"
Success: CList [CInt 1L; CInt 2L; CInt 3L]
test P_LIST_VALUE "[true,false]"
Failure: Error in Ln: 1 Col: 2
[true,false]
^
Expecting: integer number (64-bit, signed) or ']'
는 다음 [true,false]
이 성공적으로 구문 분석 : 나는 그것을 밖으로 시도하는 test
기능을 사용하면
#r @"..\packages\FParsec.1.0.2\lib\net40-client\FParsecCS.dll"
#r @"..\packages\FParsec.1.0.2\lib\net40-client\FParsec.dll"
open System
open FParsec
let test p str =
match run p str with
| Success(result, _, _) -> printfn "Success: %A" result
| Failure(errormsg, _, _) -> printfn "Failure: %s" errormsg
type CValue = CInt of int64
| CBool of bool
| CList of CValue list
let P_WHITESPACE = spaces
let P_COMMA = pstring ","
let P_L_SBRACE = pstring "[" .>> P_WHITESPACE
let P_R_SBRACE = P_WHITESPACE >>. pstring "]"
let P_INT_VALUE = pint64 |>> CInt
let P_TRUE = stringReturn "true" (CBool true)
let P_FALSE = stringReturn "false" (CBool false)
let P_BOOL_VALUE = P_TRUE <|> P_FALSE
let P_LIST_VALUE =
let commaDelimitedList ptype = sepBy (ptype .>> P_WHITESPACE) (P_COMMA .>> P_WHITESPACE)
let delimitedList = (commaDelimitedList P_INT_VALUE) <|> (commaDelimitedList P_BOOL_VALUE)
let enclosedList = between P_L_SBRACE P_R_SBRACE delimitedList
enclosedList |>> CList
, 나는 다음과 같은 결과를 얻을 수 그러나 [1,2,3]
도 비슷한 오류와 함께 실패합니다. 그래서 기본적으로, 내가 처음 사용하는 구문 분석기가 사용하려고 시도한 것입니다.
<|>
LHS가 사용자 상태를 변경하는 경우 운영자가 RHS 파서를 시도하지 않는다는 것을 이해합니다. 그러나 어떻게 될지 알 수 없습니다. P_BOOL_VALUE 및 P_INT_VALUE에는 시작 문자가 공통으로 없으므로 잘못된 데이터 유형을 구문 분석 할 때 두 가지 모두 즉시 실패해야합니다. Ints는 '거짓'또는 '참'으로 시작하지 않으며 bool은 숫자로 시작하지 않습니다.
내가 뭘 잘못하고 있니?
귀하의 코드를 테스트하지는 않았지만 두 힌트를 '시도'에 포함 시키십시오. – bytebuster
'시도 '가 필요하지 않아야하며 방금 테스트 한대로 문제가 해결되지 않습니다. 솔직히 이것이 작동하지 않는 이유를 찾을 수 없습니다. – Tarmil