Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.67 KB | None | 0 0
  1. 3.14 + 3 * (7.7/9.8^32.9 )
  2.  
  3. 3.14
  4. +
  5. 3
  6. *
  7. (
  8. 7.7
  9. /
  10. 9.8
  11. ^
  12. 32.9
  13. )
  14.  
  15. %{
  16.  
  17. #include <iostream>
  18. #include <memory>
  19.  
  20. %}
  21.  
  22.  
  23. %option prefix="Calc"
  24. %option noyywrap
  25. %option c++
  26.  
  27. ws [ t]+
  28.  
  29. dig [0-9]
  30. num1 [-+]?{dig}+.?([eE][-+]?{dig}+)?
  31. num2 [-+]?{dig}*.{dig}+([eE][-+]?{dig}+)?
  32. number {num1}|{num2}
  33.  
  34. %%
  35.  
  36. {ws} /* skip */
  37. {number} std::cout << "=> number " << YYText() << 'n';
  38.  
  39. "+"|"-"|"*"|"/"|"^" std::cout << "=> operator " << YYText() << 'n';
  40.  
  41. "("|")" std::cout << "=> parenthesis " << YYText() << 'n';
  42.  
  43. . std::cout << "=> unknown " << YYText() << 'n';
  44.  
  45. %%
  46.  
  47. int main( int argc, char **argv )
  48. {
  49. std::unique_ptr<FlexLexer> lexer(new CalcFlexLexer);
  50. while(lexer->yylex());
  51. return 0;
  52. }
  53.  
  54. $ flex calc.l
  55. $ g++-4.7 -std=c++11 -o calc lex.Calc.cc
  56. $ calc
  57. 1 + (2e4^3)
  58. => number 1
  59. => operator +
  60. => parenthesis (
  61. => number 2e4
  62. => operator ^
  63. => number 3
  64. => parenthesis )
  65.  
  66. #include <iostream>
  67. #include <vector>
  68. #include <sstream>
  69.  
  70. using namespace std;
  71.  
  72. struct token{
  73. char c;
  74. float f;
  75. bool number;
  76.  
  77. token():number(false),c(0){};
  78. };
  79.  
  80. vector<token> split(string input)
  81. {
  82. stringstream parser(input);
  83. vector<token> output;
  84. while(parser)
  85. {
  86. token t;
  87. if(isalnum(parser.peek()))
  88. parser >> t.f;
  89. else
  90. parser >> t.c;
  91. t.number = (t.c==0);
  92. output.push_back(t);
  93. }
  94. output.pop_back();
  95. return output;
  96. }
  97.  
  98. int main()
  99. {
  100. string input = "3.14 + 3 * (7.7/9.8^32.9 )";
  101. vector<token> tokens = split(input);
  102. for(unsigned int i=0;i<tokens.size();i++)
  103. {
  104. if(tokens[i].number) cout << "number: " << tokens[i].f << endl;
  105. else cout << "sign: " << tokens[i].c << endl;
  106. }
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement