Skip to content

Instantly share code, notes, and snippets.

@swgillespie
Created February 14, 2015 01:46
Show Gist options
  • Save swgillespie/9410ba1cafe9db1630dc to your computer and use it in GitHub Desktop.
Save swgillespie/9410ba1cafe9db1630dc to your computer and use it in GitHub Desktop.
%{
#include <stdio.h>
#include <string>
#include <vector>
#include "ast/ast.h"
}%
%require 2.3
%debug
%start start
%defines
%skeleton "lalr1.cc"
%name-prefix="chibic"
%define "parser_class_name" "Parser"
%locations
%initial-action
{
@$.begin.filename = @$.end.filename = &driver.streamname;
};
%parse-param { class Driver& driver }
%error-verbose
%union {
int integerVal;
double doubleVal;
std::string* stringVal;
}
%token END 0 "end of file"
%token <integerVal> INTEGER_LIT "integer"
%token <doubleVal> DOUBLE_LIT "float"
%token <stringVal> IDENTIFIER "identifier"
%token AUTO
%token CHAR
%token DEF
%token DOUBLE
%token ELSE
%token FALSE
%token FLOAT
%token FOR
%token GOTO
%token IF
%token INT
%token RETURN
%token STRUCT
%token TRUE
%token UNION
%token VOID
%token DOUBLEEQUAL
%token LEQ
%token GEQ
%token NEQ
%token LESS_THAN
%token GREATER_THAN
%token EQUAL
%token DOUBLE_OR
%token DOUBLE_AND
%token BANG
%token OR
%token AND
%token TILDE
%token AS
%token ARROW
%token LBRACE
%token RBRACE
%token LBRACKET
%token RBRACKET
%token LPAREN
%token RPAREN
%token STAR
%token SLASH
%token PLUS
%token MINUS
%token COMMA
%token COLON
%destructor { delete $$; } IDENTIFIER
%{
#include "parse_driver.hpp"
#include "scanner.hpp"
#undef yylex
#define yylex driver.lexer->lex
%}
%%
start : /* empty */
| start function_definition
| start type_definition
type_specifier : INT
| UINT
| LONG
| FLOAT
| DOUBLE
| CHAR
| VOID
| anonymous_struct_or_union
| IDENTIFIER
anonymous_struct_or_union : STRUCT LBRACE fields RBRACE
| UNION LBRACE fields RBRACE
type_name : type_specifier
| pointer type_specifier
| type_specifier array_specifier
| pointer type_specifier array_specifier
array_specifier : LBRACKET function_body RBRACKET
| array_specifier LBRACKET function_body RBRACKET
pointer : STAR
| pointer STAR
type_definition : DEF STRUCT LBRACE fields RBRACE
fields : nonempty_field_list
nonempty_field_list : IDENTIFIER COLON type_name
| IDENTIFIER COLON type_name COMMA nonempty_field_list
function_definition : DEF IDENTIFIER LPAREN FIELDS RPAREN return_type function_body
return_type : /* empty */
| ARROW type_name
function_body : MOCK
%%
void chibic::Parser::error(const Parser::location_type& l,
const std::string& message) {
driver.error(l, message);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment