Tokenizing math expression with functions in C#

馋奶兔 提交于 2019-12-12 01:48:58

问题


I figured this would be easy to find, but I haven't been successful.

I need to be able to tokenize the following expression

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

into

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

It seems like this is probably a common need, however I haven't been able to find any good documentation on this out there. Is this something I could do using regex? Anybody know of an existing way to do this?

I'm using C#, but if you have the answer in another language, don't be shy.

Thanks in advance.


回答1:


If you are looking into a robust and powerful solution, you should definitively look into a lexical analyzer (like Antlr). However if what you need is just tokenization of simple expressions like the one you provided, you can achieve this result pretty easily:

// 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;
        }

Example:

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]: ")"


来源:https://stackoverflow.com/questions/28423567/tokenizing-math-expression-with-functions-in-c-sharp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!