python2ruby/src/parser.y
2025-11-25 18:08:55 +01:00

51 lines
No EOL
1.2 KiB
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 BIT_NOT BIT_AND BIT_OR BIT_XOR LSHIFT RSHIFT PLUS_ASSIGN MINUS_ASSIGN MULTIPLY_ASSIGN DIVIDE_ASSIGN MODULO_ASSIGN BIT_AND_ASSIGN BIT_OR_ASSIGN BIT_XOR_ASSIGN LSHIFT_ASSIGN RSHIFT_ASSIGN
%token KW_DEF KW_IF KW_RETURN KW_FOR KW_IN KW_NOT KW_AND KW_OR KW_PASS KW_ELSE KW_ELIF KW_CLASS
%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";
}
}