使用单词标记数学表达式

问题描述 投票:0回答:1

我们在C ++中有regex库。通过使用它,我想 解析 标记以下数学表达式。

(bar+3)*foo/3+-1

(
bar
+
3
)
*
foo
/
3
+
-1

要做到这一点,我尝试了一个,但它没有提供与预期相反的输出,而不是令牌化

std::string s ("(bar+3)*foo/3+-1");
std::smatch m;
std::regex e ("^[-+(]*[[:digit:]]+[)]*([-+*/][-+(]*[[:digit:]]+[)]*)*$");

怎么做到呢?

编辑:抱歉写错了。

c++ regex c++11
1个回答
0
投票

此代码将数学表达式标记化

int main()
{
    string s = "(bar+3)*foo/3+-1";
    regex re("[[:digit:]]+|[[:alpha:]][[:alnum:]]*|[-+*/()]");
    auto tokens_begin = 
        std::sregex_iterator(s.begin(), s.end(), re);
    auto tokens_end = std::sregex_iterator();
    while (tokens_begin != tokens_end)
    {
        cout << tokens_begin->str() << endl;
        ++tokens_begin;
    }
}

产量

(
bar
+
3
)
*
foo
/
3
+
-
1

在此代码中,-始终被视为运算符,因此-1被视为一元减号,后跟无符号数。如果不做一些真正的解析,可能不可能做得更好。

© www.soinside.com 2019 - 2024. All rights reserved.