Advertisement
piomar123

GNU Bison C++ Variant bug

Jun 28th, 2017
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.02 KB | None | 0 0
  1. // ==== lexer.flex ====
  2. %option noyywrap
  3. %option nounput
  4. %option noinput
  5.  
  6. %{
  7. #include "parser.yy.hpp"
  8. typedef yy::parser::token token;
  9. #define YY_DECL int yylex(yy::parser::semantic_type * yylval)
  10. %}
  11.  
  12. %%
  13. [ \n\t]+
  14. [0-9]+      {
  15.                 yylval->build(atoi(yytext));
  16.                 return token::NUM;
  17.             }
  18. .           {
  19.                 return yytext[0];
  20.             }
  21.  
  22. // ==== parser.y ====
  23. %require "3.0"
  24. %skeleton "lalr1.cc"
  25. %defines
  26. %define api.value.type variant
  27.  
  28. %code {
  29. #include <iostream>
  30. #include "parser.yy.hpp"
  31. extern int yylex(yy::parser::semantic_type * yylval);
  32. }
  33.  
  34. %token <int> NUM
  35.  
  36. %%
  37. expr: NUM | expr { $<int>$ = 42; } '+' NUM { std::cout << $<int>2 << std::endl; };
  38.  
  39. %%
  40. void yy::parser::error(const std::string & message){
  41.     std::cerr << message << std::endl;
  42. }
  43.  
  44. int main(){
  45.     yy::parser p;
  46.     return p.parse();
  47. }
  48.  
  49. // ==== build.sh ====
  50. #!/bin/sh
  51. set -e
  52. bison -o parser.yy.cpp parser.y
  53. flex -o lexer.c lexer.flex
  54. g++ parser.yy.cpp lexer.c -O2 -Wall -o parser
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement