说我有:

3.14 + 3 * (7.7/9.8^32.9  )

我需要标记此输入字符串:
3.14
+
3
*
(
7.7
/
9.8
^
32.9
)

是否有使用Stringstream或STL进行其他操作的简便方法,还是我应该一次查看输入的1个字符并自己完成?

最佳答案

通常,您将使用Flex/Bison生成一个简单的lexer和可选的parser。或者,如果您只追求C++编译器解决方案-Boost.Spirit(example)。我相信,您不想要纯粹的STL解决方案。

我赞成使用Flex / Bison方法,因此用Flex编写的 token 生成器将是:

%{

#include <iostream>
#include <memory>

%}


%option prefix="Calc"
%option noyywrap
%option c++

ws      [ \t]+

dig     [0-9]
num1    [-+]?{dig}+\.?([eE][-+]?{dig}+)?
num2    [-+]?{dig}*\.{dig}+([eE][-+]?{dig}+)?
number  {num1}|{num2}

%%

{ws} /* skip */
{number} std::cout << "=> number " << YYText() << '\n';

"+"|"-"|"*"|"/"|"^" std::cout << "=> operator " << YYText() << '\n';

"("|")" std::cout << "=> parenthesis " << YYText() << '\n';

. std::cout << "=> unknown " << YYText() << '\n';

%%

int main( int argc, char **argv )
{
    std::unique_ptr<FlexLexer> lexer(new CalcFlexLexer);
    while(lexer->yylex());
    return 0;
}

并编译命令行:
$ flex calc.l
$ g++-4.7 -std=c++11 -o calc lex.Calc.cc
$ calc
1 + (2e4^3)
=> number 1
=> operator +
=> parenthesis (
=> number 2e4
=> operator ^
=> number 3
=> parenthesis )

08-26 19:27
查看更多