【问题标题】:parsing lines of text ending with '\n' using sprache使用 sprache 解析以 \'\\n\' 结尾的文本行
【发布时间】:2022-12-19 15:57:33
【问题描述】:

我有一个示例文本行“FunTest\n”,我正在尝试使用 sprache 对其进行解析。我写了一些示例代码,见下文,但它失败并出现异常:

解析失败:到达意外的输入结束;预期(第 2 行,第 1 列);最近消费:FunTest

using Sprache;
void Main()
{
    Parser<char> NEW_LINE_Parser = Parse.Char('\n').Token();

    Parser<string> Text =
           (from content in Parse.CharExcept('\n').Many().Text()
            select content).Token();

    Parser<string> Text_Parser =
                from commandStr in Text
                from newLine in NEW_LINE_Parser
                select commandStr;

    Text_Parser.Parse("FunTest\n");
}

为什么它会因错误而失败?我想提取匹配 '\n' 字符之前的文本

【问题讨论】:

  • 看起来解析器 Text 已经将 '\n' 符号视为行尾,所以当 newLine 到达那里时,(意外地)没有要解析的文本。如果你想这样做,你应该为 EOL 使用不同的字符。将 '\n' 替换为 '!'在您的代码中将按预期运行。
  • 可能是“Parse”使用长度变量,自己进行修剪并期望最终字符串的长度为 8,而在修剪之后它只有 7。也可能是它读取字符串作为可能的文字和期望最终字符串的长度为 8,但收到的字符串长度等于 9...idk。我不会像 Oleg 建议的那样使用 .Trim(),但我会尝试使用 .Split('\n'),在这里您将确切知道事后何时需要插入新行。

标签: c# parsing sprache


【解决方案1】:

.Token() 吃换行符。我会说你不需要它,因为你解析除换行符之外的任何字符 - 所以空格也被解析并返回。

如果你喜欢修剪命令字符串,你可以在 Text_Parser 中修剪它,比如:

Parser<char> NEW_LINE_Parser = Parse.Char('
');

Parser<string> Text =
    (from content in Parse.CharExcept('
').Many().Text()
        select content);

Parser<string> Text_Parser =
    from commandStr in Text
    from newLine in NEW_LINE_Parser
    select commandStr.Trim();

Text_Parser.Parse("FunTest 
");

【讨论】:

  • 那奏效了。我会阅读有关使用 Token 如何耗尽换行符的信息。
【解决方案2】:

使用 Text_Parser.trim(); 不是更容易吗? 这个去掉了结尾的空格、制表符和 .还包括(如果不包括)使用系统;

【讨论】:

  • 我正在尝试做的是我正在使用 sprache 开发的更大语法的一部分。所以不想用字符串处理函数
  • 我懂了。好吧,如果我能更好地帮助你,我会回来的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多