- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Sprache 解析文件的一部分,如下所示:
OneThing=Foo
AnotherThing=Bar
YetAnotherThing=Baz
所有三行都是强制性的,但它们可以以任何顺序出现。我有针对各个行的解析器,看起来像这样:
public static readonly Parser<string> OneThing = (
from open in Parse.String("OneThing=")
from rest in Parse.AnyChar.Except(Parse.LineTerminator).Many().Text()
from newLine in Parse.LineEnd
select rest
);
然后我将它们组合起来解析整个部分,如下所示:
public static readonly Parser<MyClass> Section = (
from oneThing in SectionGrammar.OneThing
from anaotherThing in SectionGrammar.AnotherThing
from yetAnotherThing in SectionGrammar.YetAnotherThing
select new MyClass(oneThing, anotherThing, yetAnotherThing)
);
但这只有在行以 OneThing、AnotherThing、YetAnotherThing 的顺序出现时才有效。我怎样才能更改它以允许行以任何顺序出现,但仍然强制每行应该出现一次?
非常感谢任何帮助!谢谢
最佳答案
我对 Sprache 非常天真,但一种可能很冗长的方法是为每一行选择每个选项的元组,然后在最终选择中过滤元组数组。像这样的东西:
public static readonly Parser<MyClass> Section = (
select a from (from oneThing in SectionGrammar.OneThing select Tuple.Create(oneThing, null, null))
.Or(from anotherThing in SectionGrammar.AnotherThing select Tuple.Create(null, anotherThing, null))
.Or(from yetAnotherThing in SectionGrammar.YetAnotherThing select Tuple.Create(null, null, yetAnotherThing))
select b from (from oneThing in SectionGrammar.OneThing select Tuple.Create(oneThing, null, null))
.Or(from anotherThing in SectionGrammar.AnotherThing select Tuple.Create(null, anotherThing, null))
.Or(from yetAnotherThing in SectionGrammar.YetAnotherThing select Tuple.Create(null, null, yetAnotherThing))
select c from (from oneThing in SectionGrammar.OneThing select Tuple.Create(oneThing, null, null))
.Or(from anotherThing in SectionGrammar.AnotherThing select Tuple.Create(null, anotherThing, null))
.Or(from yetAnotherThing in SectionGrammar.YetAnotherThing select Tuple.Create(null, null, yetAnotherThing))
select new MyClass(
new[] { a, b, c }.Where(i => i.Item1 != null).Select(i => i.Item1).First(),
new[] { a, b, c }.Where(i => i.Item2 != null).Select(i => i.Item2).First(),
new[] { a, b, c }.Where(i => i.Item3 != null).Select(i => i.Item3).First()
));
不过感觉应该有更好的办法。如果您对我说有 20 行具有独特的解析并且可能有不同的顺序,那么上面的代码也不是很可扩展。
关于c# - 如何使用 Sprache 解析可以以任何顺序出现的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62060732/
我还没有找到一个例子——如何处理字符转义。我找到了一个代码示例: static void Main(string[] args) { string text = "'test \\\' tex
我正在为一种类似于 SQL 的语言开发解析器,但我在创建一些语言规则时遇到了问题,例如:expression IS NULL 和 expression IN (expression1, express
我正在构建一个 Sprache 解析器来解析类似于 SQL 搜索条件的表达式。例如 Property = 123 或 Property > AnotherProperty 到目前为止,这两个示例都有效
我正在尝试编写一些代码来根据模式匹配字符串: 模式:“狗和(猫或山羊)” 测试字符串:“doggoat” 结果:true 测试字符串:“dogfrog” 结果:false 我正在尝试使用 Sprach
我正在使用 Sprache 解析文件的一部分,如下所示: OneThing=Foo AnotherThing=Bar YetAnotherThing=Baz 所有三行都是强制性的,但它们可以以任何顺序
我有一个报表服务器,需要使用一些控制报表内容的参数来解析字符串。 我正在使用解析器库 sprache 来帮助解决这个问题。一切都工作正常,除了一件事我被困住了。 我有一个时间过滤器,可以是以下值之一:
我正在使用 Sprache 构建一个简单的命令式语法。我正在尝试找出是否有一种方法可以在缺少结束字符(例如 ]、, })时获得更好的错误报告。 如果缺少结束字符,我的语法会正确报告错误。然而,消息传递
我的语法中有这些解析器: public static readonly Parser SpaceOrTab = Parse.Char(' ').Or(Parse.Char('\t'))
我开始使用 Sprache 来解析数学表达式的领域特定语言。我知道我可以使用如下方法解析标识符: static readonly Parser Identifier = fro
我正在编写一个符合 System for Cross-domain Identity Management: Protocol Filtering 的解析器规范我几乎可以用 Sprache 解析任何表
我在使用基于 Sprache 的解析器时遇到了一些问题。我正在尝试解析一个字符串,其中有两种可能要解析的内容。一种选择是使用常规变量名称,如 x 或更复杂的版本 x[1]。第一个引用一个简单变量,第二
我是一名优秀的程序员,十分优秀!