使用C#中的函数对数学表达式进行标记

时间:2015-02-10 03:26:48

标签: c# parsing tokenize

我认为这很容易找到,但我没有成功。

我需要能够标记以下表达式

  

(4 + 5)+ myfunc('两个字',3,5)

(
4
+
5
+
myfunc
(
'two words'
,
3
,
5
)

这似乎是一个普遍的需求,但是我还没有找到任何关于此的好文档。这是我用正则表达式做的事吗?有人知道现有的方法吗?

我正在使用C#,但如果您有其他语言的答案,请不要害羞。

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您正在寻找一个强大而强大的解决方案,那么您应该明确地研究一个词法分析器(如Antlr)。但是,如果您需要的只是对您提供的简单表达式进行标记化,则可以非常轻松地实现此结果:

// TODO Refactor and optimize this function
        public IList<string> TokenizeExpression(string expr)
        {
            // TODO Add all your delimiters here
            var delimiters = new[] { '(', '+', ')', ',' };
            var buffer = string.Empty;
            var ret = new List<string>();
            expr = expr.Replace(" ", "");
            foreach (var c in expr)
            {
                if (delimiters.Contains(c))
                {
                    if (buffer.Length > 0) ret.Add(buffer);
                    ret.Add(c.ToString(CultureInfo.InvariantCulture));
                    buffer = string.Empty;
                }
                else
                {
                    buffer += c;
                }
            }
            return ret;
        }

示例:

  

TokenizeExpression(“(4 + 5)+ myfunc('two words',3,5)”)Count = 14

[0]: "("
[1]: "4"
[2]: "+"
[3]: "5"
[4]: ")"
[5]: "+"
[6]: "myfunc"
[7]: "("
[8]: "'twowords'"
[9]: ","
[10]: "3"
[11]: ","
[12]: "5"
[13]: ")"