SQL 검색 조건을 구문 분석하고 파서가 다른 중온 연산자와 논리 (AND
, OR
)를 구별하는 데 문제가 있습니다. 나는 그들을 다른 노드 (아마도 어려운 일)로 파싱 할 것이지만 평가 단계를 단순화한다. 관련 코드 스 니펫 (필요한 경우 더 많이 포함 할 수 있음)입니다.다른 중온어 연산자와 논리 구분
let opp = OperatorPrecedenceParser<_,_,_>()
let scalarExpr = opp.ExpressionParser
opp.TermParser <- constant <|> id <|> between lparen rparen scalarExpr <|> scalarExpr
//infix operators added here
let comparison = //(e.g., 1 < 2)
let compareExpr = pipe3 scalarExpr compareOp scalarExpr (fun l op r -> Comparison(op, l, r))
between lparen rparen compareExpr <|> compareExpr
let andTerm = pstringCI "and" .>> ws
let orTerm = pstringCI "or" .>> ws
let searchCondition, searchConditionRef = createParserForwardedToRef()
searchConditionRef :=
[ comparison
pipe3 searchCondition andTerm searchCondition (fun l _ r -> And(l, r))
pipe3 searchCondition orTerm searchCondition (fun l _ r -> Or(l, r))
between lparen rparen searchCondition ]
|> choice
let filter : Parser<_,unit> = ws >>. searchCondition .>> eof
"1 = 1"
가 제대로 Comparison (Eq,Constant (Int32 1),Constant (Int32 1))
에 구문 분석하지만 예를 들어, 논리 연산자, "1 = 1 or 2 = 2"
두 비교에 가입하려고하면, 그것은 LN에
오류와 구문 분석 실패 : 1 골 : 7
1 = 1 또는 2 = 2
,583,210 ^
기대 :
입력 또는 이항 연산자의 끝 : 그것은 스칼라 식과 오류 전에or
철수 타격시1
파싱 예상 7
는 그것을 아닌 것 실현 중위 연산자 인 경우 1
을 완전한 스칼라로 반환하고 논리 연산자 or
에 의해 조인 된 조건의 왼쪽 부분을 파싱하는 것으로 인식합니다.
대신에, 더 복잡한 스칼라 표현식을 시작할 가능성이 있다고 가정합니다. 아마도 중위 연산자를 포함 할 수 있습니다.
코드에 문제가 있습니까? AND
/OR
을 삽입 연산자로 구문 분석하는 솔루션입니까 (동일 OperatorPrecedenceParser
사용)? 나는 그 길을 가고 싶지 않아, 나는 어딘가에서 간단한 실수를하기를 바라고있다.
complete code은 요지입니다.
기본적으로 백 트랙킹이 아닙니다. 나는'search'를'searchConditionRef'에서'시도 비교 '로 바꾸면 파서가 당신의 예제에서 올바르게 작동 할 것입니다. – pad
@pad : 시도했지만 동일한 오류가 발생했습니다. – Daniel
죄송합니다. 신중하게 읽지 않으려면 And 구문 분석기의 두 번째 사례에도'시도 '를해야합니다. 귀하의 예제는'또는'; 'searchConditionRef'의 세 번째 경우와 일치합니다. – pad