说我有:
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 )