我们在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:]]+[)]*)*$");
怎么做到呢?
编辑:抱歉写错了。
此代码将数学表达式标记化
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
被视为一元减号,后跟无符号数。如果不做一些真正的解析,可能不可能做得更好。