Created
February 14, 2015 01:46
-
-
Save swgillespie/9410ba1cafe9db1630dc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%{ | |
#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