51 lines
No EOL
996 B
Text
51 lines
No EOL
996 B
Text
%skeleton "lalr1.cc"
|
|
%require "3.0"
|
|
%defines
|
|
%define api.value.type variant
|
|
%define api.token.raw
|
|
%define api.parser.class { parser }
|
|
%define api.namespace { yy }
|
|
%define api.token.prefix {TOK_}
|
|
%define parse.trace
|
|
|
|
|
|
%code requires {
|
|
#include <string>
|
|
class Scanner;
|
|
}
|
|
|
|
%code {
|
|
#include <iostream>
|
|
#include "scanner.hpp"
|
|
|
|
#undef yylex
|
|
#define yylex scanner->lex
|
|
}
|
|
|
|
%parse-param { Scanner* scanner }
|
|
|
|
%token <std::string> IDENTIFIER
|
|
%token <std::string> STRING
|
|
%token <int> NUMBER
|
|
%token ASSIGN PLUS MINUS L_PAREN R_PAREN COLON EQ NE LT GT LTE GTE MULTIPLY DIVIDE MODULO L_BRACKET L_BRACE R_BRACKET R_BRACE DOT SEMICOLON COMMA
|
|
%token KW_DEF KW_IF KW_RETURN KW_FOR KW_IN
|
|
%token EOF NEWLINE INDENT DEDENT
|
|
|
|
|
|
%%
|
|
input:
|
|
/* empty */
|
|
| input element
|
|
;
|
|
|
|
element:
|
|
IDENTIFIER { std::cout << "IDENTIFIER: " << $1 << "\n"; }
|
|
;
|
|
|
|
%%
|
|
namespace yy {
|
|
void parser::error(const std::string& msg)
|
|
{
|
|
std::cerr << "Error: " << msg << "\n";
|
|
}
|
|
} |