5

我正在将代码从 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

4

3 回答 3

11

您可以使用Regex.Split零宽度断言。例如,以下将拆分+-*/

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

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

于 2009-07-15T22:04:38.550 回答
4

这会产生您的输出:

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);
于 2009-07-15T22:08:51.693 回答
1

如果您想要一个非常灵活、强大、可靠且可扩展的解决方案,您可以使用ANTLR 的 C# 端口。对于这样一个小项目,有一些初始开销(链接是 VS2008 的设置信息)可能会导致过度杀伤。这是一个支持变量的计算器示例

可能对您的课程来说太过分了,但是如果您有兴趣了解此类现实世界问题的“真实”解决方案,请看一看。我什至有一个用于处理语法的 Visual Studio 包,或者您可以单独使用ANTLRWorks

于 2009-07-15T22:02:34.827 回答