问题标签 [sprache]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
220 浏览

c# - 丢弃 LINQ“from”语句的行

我正在使用 Sprache 库,它允许使用 LINQ 构建解析器。但是,有时我需要解析一些东西然后丢弃结果。例如:

我不需要以 为前缀的三个变量中的任何一个__,因此似乎没有必要用它们污染命名空间。

有什么方法可以执行 LINQ 查询并丢弃这三个结果?

0 投票
1 回答
242 浏览

sprache - 如何在 Sprache 解析器中使用 Token() 方法

我正在使用 'Token()' 方法来丢弃前导和尾随空格,但它不会,此测试失败并显示消息 Expected string to be "token", but it has unexpected whitespace at the end.

我试图在方法Token()之前调用方法,Text()但它也无济于事。 Parse.AnyChar.Many().Token().Text()

如何Token()正确使用方法?

0 投票
2 回答
448 浏览

c# - 使用清空列表的选项解析值列表

我正在尝试解析一组项目,使用 C# 的 Sprache 库我有一个像这样的工作代码。

其中“Literal”是数字或字符串的解析器,“Identifier”是变量标识符的解析器,“Comma”是逗号标记的解析器。但是,如果我希望数组允许为空“[]”,我需要添加 Optional() 属性并验证是否定义了“items”:

是否有更好的清洁方法来解析由分隔符分隔的项目列表,该列表可以为空(列表)。我可以在其他项目列表中重复使用。

输入数据结构示例:

0 投票
2 回答
159 浏览

c# - Sprache -- 无法识别这个序列

我想匹配第一个字符是字母的字符串,然后是数字或字母的多个字符,最后以字母结尾。例如a11a11a,正确但a11aa11不正确,因为它以数字而不是字母结尾。

我编写了以下代码来做到这一点:

不幸的是LetterOrDigit.Many(),也消耗了最后一个字母。

有什么办法可以避免这种情况?

0 投票
1 回答
1531 浏览

c# - Sprache 中的递归表达式解析

我正在构建一个 Sprache 解析器来解析类似于 SQL 搜索条件的表达式。例如Property = 123Property > AnotherProperty

到目前为止,这两个示例都有效,但是我正在努力弄清楚我需要做什么来允许 ANDing/ORing 条件和括号。

到目前为止,基本上我有这个:

这适用于上面的简单情况,但现在我需要一个关于如何实现条件的指针,例如:

  • PropertyX = PropertyY OR PropertyX = PropertyZ
  • PropertyA > PropertyB AND (OtherAnotherProperty = 72 OR OtherAnotherProperty = 150)

谁能给我一个关于如何为这类事情构建解析器的想法?

0 投票
1 回答
522 浏览

c# - Sprache 中的文本查询解析

我正在尝试编写一些代码来匹配基于模式的字符串:

模式:“狗和(猫或山羊)”

测试字符串:“doggoat” 结果:true

测试字符串:“dogfrog” 结果:假

我正在尝试使用 Sprache 编写解析器,其中大部分逻辑由 Corey对类似问题的出色回答提供。我快到了,但是运行代码时出现异常:

System.Func'没有为类型2[System.String,System.Boolean]' 和 ''System.Func`2[System.String,System.Boolean]'定义二元运算符 AndAlso 。

我知道这意味着我需要将表达式树节点处的 lambda 表达式与逻辑运算符结合起来,我根据此处另一个问题的答案尝试使用 ExpressionVisitor 。但是,程序在执行 ExpressionVisitor 之前崩溃 - 似乎首先执行 Parse 命令,但我不太明白为什么(可能是因为 Sprache.Parse.Select 语句不强制执行 lambda?) ,或者如何强制它先被执行。
示例代码如下(为了简洁起见,我删除了所有运算符,但“和”除外,从Corey 的模板中重新引入它们是微不足道的。必须从 NuGet 添加 Sprache 才能编译代码。

0 投票
1 回答
543 浏览

c# - 用 Sprache 解析短语(以空格分隔的单词)

我正在尝试在 Sprache 中编写一个解析器来解析一个短语

基本规则是它应该包含由单个空格分隔的单词,字符串的第一个和最后一个字符都是一个空格。

我希望调用如下内容:

并让结果字符串为“我想回到这一点”。

我已经尝试了许多实现,但没有一个完全适合我。

更新 感谢@PanagiotisKanavos,诀窍是使用 .Then() 运算符。下面的话:

可能仍然可以清理一下,但这个概念就在那里。

0 投票
0 回答
449 浏览

c# - 如何使用 Sprache 解析条件三元语法 (a > b ? a : b)

我一直在想我用得越多就明白 Sprache 解析,但后来我遇到了一个让我困惑的新语法,而且网上没有很多例子。此时,我试图让我的字符串具有条件语法(如 C#),例如:

我使用以下解析让常规运算符正常工作(>、<、!、= 等):

但当然,常规运算符都使用单个字符串(例如:“<”)作为运算符字符串,而条件运算符需要更复杂的内容,例如:

因此,我尝试将这样的Parser ExpressionType拼凑在一起,但是我当然不能完全正确地使用语法:

然后,一旦我弄清楚了,我是否将这个 Conditional与其他运算符一起传递给Parse.ChainOperator方法?其他运算符都没有在其定义的任一侧引用表达式,所以我认为可能不会。

我还尝试像这样创建一个单独的解析器表达式(但我不会以允许条件语法在字符串中的任何位置使用的方式工作(而不仅仅是作为顶级一次性表达式):

[此解决方案的另一个问题是它声称“测试”不是布尔值]

这一切都表明条件运算符在很多方面都很特别。欢迎提出建议。感谢您提供的任何意见。

更新#1 这是我的 Expr 的代码。在这篇文章中,我不确定兔子洞要走多深......

0 投票
2 回答
412 浏览

c# - 使用 Sprache 解析文本时,我可以确定原始字符串中的当前索引吗?

我设置了 Sprache 来解析一个 Equation,其中包含许多不同的可能方法调用。解析方法后,有没有办法确定原始字符串中的索引值?也许 Parse 有一个可以以某种方式访问​​的“当前索引”值和“长度”值?

示例输入字符串:

使用这样的解析器...

谁能想到一个“技巧”,可以让我确定第一个 CallMethod 处理SubString(0, 18),第二个 CallMethod 处理来自原始字符串的SubString(21, 14) ?

0 投票
0 回答
72 浏览

sprache - 如何扩展语调解析器以处理前导和尾随自由文本

我有一个成功识别各种复杂字符串的语调解析器。

如果这些字符串嵌入在自由文本中,我现在必须找到它们。这可能吗?

例如,“FJ21 [7-20]”和“7.2x1.2 FULL”是我的解析器可以匹配的字符串示例。

我需要能够在文本中找到它们,例如:

“快棕色 FJ21 [7-20] 跳过懒惰的 7.2x1.2 FULL”