为了使用 实现不区分大小写的中缀运算符OperatorPrecedenceParser
,我正在预处理输入,将其解析为由字符串文字分隔的文本。然后在文本部分搜索需要大写的中缀运算符(以符合 已知的运算符OPP
)。然后进行实际的解析。
我的问题是,这两个阶段可以组合成一个解析器吗?我试过
// preprocess: Parser<string,_>
// scalarExpr: Parser<ScalarExpr,_>
let filter = (preprocess .>> eof) >>. (scalarExpr .>> eof)
但它在输入结束时失败,似乎期待一个scalarExpr
. 输入可以独立地解析preprocess
,scalarExpr
所以我猜这是一个问题eof
,但我似乎无法正确理解。这可能吗?
这是其他解析器供参考。
let stringLiteral =
let subString = manySatisfy ((<>) '"')
let escapedQuote = stringReturn "\"\"" "\""
(between (pstring "\"") (pstring "\"") (stringsSepBy subString escapedQuote))
let canonicalizeKeywords =
let keywords =
[
"OR"
"AND"
"CONTAINS"
"STARTSWITH"
"ENDSWITH"
]
let caseInsensitiveKeywords = HashSet(keywords, StringComparer.InvariantCultureIgnoreCase)
fun text ->
let re = Regex(@"([\w][\w']*\w)")
re.Replace(text, MatchEvaluator(fun m ->
if caseInsensitiveKeywords.Contains(m.Value) then m.Value.ToUpperInvariant()
else m.Value))
let preprocess =
stringsSepBy
((manySatisfy ((<>) '"')) |>> canonicalizeKeywords)
(stringLiteral |>> (fun s -> "\"" + s + "\""))