如何使用C#中的Irony解析含null值的键值对字符串?
使用Irony解析包含null值的键值对字符串
Irony完全支持解析包含null值的键值对,你只需要扩展现有的语法规则,让值部分同时接受字符串字面量和null关键字即可。
修改后的完整代码示例
// 定义字符串字面量(保留你原有的定义) var stringLiteral = new StringLiteral("String", "\""); // 定义null关键字作为字面量 var nullLiteral = new KeyTerm("null", "Null"); // 定义值的非终结符:允许是字符串或者null var value = new NonTerminal("Value"); value.Rule = stringLiteral | nullLiteral; // 定义比较操作符(明确匹配等号,避免歧义) var comparisonOp = new NonTerminal("ComparisonOp"); comparisonOp.Rule = "="; // 定义键的规则:如果是固定"Key"就用下面的写法,如果要支持任意标识符,换成IdentifierTerminal var key = new NonTerminal("Key"); key.Rule = "Key"; // 或者 new IdentifierTerminal("KeyIdentifier") 支持任意合法标识符 // 构建最终的过滤规则 var filterRule = new BnfExpression(); filterRule |= key + comparisonOp + value;
解析后的判断逻辑
解析完成后,你可以通过检查ParseTreeNode的类型来区分值是字符串还是null:
// 假设解析得到根节点root var valueNode = root.ChildNodes[2]; if (valueNode.Term is StringLiteral) { string strValue = valueNode.Token.ValueString; // 处理字符串值逻辑 } else if (valueNode.Term is KeyTerm && valueNode.Token.Text.Equals("null", StringComparison.OrdinalIgnoreCase)) { // 处理null值逻辑 }
这样修改后,你的语法规则就能同时匹配key = "value"和key = null两种格式了。
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

