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 。