C#Tokenizer – 保持分隔符

我正在努力将代码从JAVA移植到C#,而部分JAVA代码使用了tokenizer – 但我的理解是,Java中stringtokenizer生成的数组也会有分隔符(在这种情况下为+, – ,/,* ,(,))作为代币。 我试图使用C#Split()函数,但它似乎消除了分隔符本身。 最后,这将解析一个字符串并将其作为计算运行。 我做了很多研究,但没有找到关于这个主题的任何参考资料。

有谁知道如何让它们遇到的实际分隔符在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

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

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

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

这会产生你的输出:

 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); 

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

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