Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==== lexer.flex ====
- %option noyywrap
- %option nounput
- %option noinput
- %{
- #include "parser.yy.hpp"
- typedef yy::parser::token token;
- #define YY_DECL int yylex(yy::parser::semantic_type * yylval)
- %}
- %%
- [ \n\t]+
- [0-9]+ {
- yylval->build(atoi(yytext));
- return token::NUM;
- }
- . {
- return yytext[0];
- }
- // ==== parser.y ====
- %require "3.0"
- %skeleton "lalr1.cc"
- %defines
- %define api.value.type variant
- %code {
- #include <iostream>
- #include "parser.yy.hpp"
- extern int yylex(yy::parser::semantic_type * yylval);
- }
- %token <int> NUM
- %%
- expr: NUM | expr { $<int>$ = 42; } '+' NUM { std::cout << $<int>2 << std::endl; };
- %%
- void yy::parser::error(const std::string & message){
- std::cerr << message << std::endl;
- }
- int main(){
- yy::parser p;
- return p.parse();
- }
- // ==== build.sh ====
- #!/bin/sh
- set -e
- bison -o parser.yy.cpp parser.y
- flex -o lexer.c lexer.flex
- g++ parser.yy.cpp lexer.c -O2 -Wall -o parser
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement