Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 3.14 + 3 * (7.7/9.8^32.9 )
- 3.14
- +
- 3
- *
- (
- 7.7
- /
- 9.8
- ^
- 32.9
- )
- %{
- #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 )
- #include <iostream>
- #include <vector>
- #include <sstream>
- using namespace std;
- struct token{
- char c;
- float f;
- bool number;
- token():number(false),c(0){};
- };
- vector<token> split(string input)
- {
- stringstream parser(input);
- vector<token> output;
- while(parser)
- {
- token t;
- if(isalnum(parser.peek()))
- parser >> t.f;
- else
- parser >> t.c;
- t.number = (t.c==0);
- output.push_back(t);
- }
- output.pop_back();
- return output;
- }
- int main()
- {
- string input = "3.14 + 3 * (7.7/9.8^32.9 )";
- vector<token> tokens = split(input);
- for(unsigned int i=0;i<tokens.size();i++)
- {
- if(tokens[i].number) cout << "number: " << tokens[i].f << endl;
- else cout << "sign: " << tokens[i].c << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement