【问题标题】:C# Tokenizer - keeping the separators [duplicate]C# Tokenizer - 保持分隔符[重复]
【发布时间】:2010-11-11 04:23:14
【问题描述】:

我正在将代码从 JAVA 移植到 C#,部分 JAVA 代码使用标记器 - 但据我了解,Java 中的 stringtokenizer 生成的数组也将具有分隔符(在本例中为 +、-、 /, *, (, )) 作为记号。我曾尝试使用 C# Split() 函数,但它似乎消除了分隔符本身。最后,这将解析一个字符串并将其作为计算运行。我做了很多研究,但没有找到任何关于该主题的参考资料。

有谁知道如何按照遇到的顺序将实际的分隔符放入拆分数组中?

标记化代码:

public CalcLexer(String s)
{
    char[] seps = {'\t','\n','\r','+','-','*','/','(',')'};
    tokens = s.Split(seps);
    advance();
}

测试:

static void Main(string[] args)
    {
        CalcLexer myCalc = new CalcLexer("24+3");
        Console.ReadLine();
    }

“24+3”将导致以下输出:“24”、“3”我正在寻找“24”、“+”、“3”的输出

在完全公开的性质上,该项目是课堂作业的一部分,并使用以下完整源代码:

http://www.webber-labs.com/mpl/source%20code/Chapter%20Seventeen/CalcParser.java.txt http://www.webber-labs.com/mpl/source%20code/Chapter%20Seventeen/CalcLexer.java.txt

【问题讨论】:

  • 忘记添加:“24+3”将导致以下输出:24 3 我正在寻找 24 + 3 的输出
  • @Philip Harris:你可以编辑你的问题,这比添加 cmets 更好
  • 您可以编辑自己的帖子而不是添加评论;)

标签: c# stringtokenizer


【解决方案1】:

如果您想要一个非常灵活、强大、可靠且可扩展的解决方案,您可以使用C# port of ANTLR。对于这样一个小项目,有一些initial overhead (link is setup information for VS2008) 可能会导致矫枉过正。这是calculator example with support for variables

对于您的课程来说可能有点矫枉过正,但如果您有兴趣了解此类现实世界问题的“真实”解决方案,请看一看。我什至有一个Visual Studio package for working with the grammars,或者你可以单独使用ANTLRWorks

【讨论】:

    【解决方案2】:

    您可以将Regex.Split 与零宽度断言一起使用。例如,以下内容将在+-*/ 上拆分:

    Regex.Split(str, @"(?=[-+*/])|(?<=[-+*/])");
    

    这实际上是说,“如果它后面跟着或前面是-+*/ 中的任何一个,则在此时拆分。匹配的字符串本身的长度为零,因此您不会丢失输入字符串的任何部分.

    【讨论】:

    • 现在你有两个问题
    【解决方案3】:

    这会产生你的输出:

    string s = "24+3";
    string seps = @"(\t)|(\n)|(\+)|(-)|(\*)|(/)|(\()|(\))";
    string[] tokens = System.Text.RegularExpressions.Regex.Split(s, seps);
    
    foreach (string token in tokens)
        Console.WriteLine(token);
    

    【讨论】:

      猜你喜欢
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      相关资源
      最近更新 更多