Add support for C++ namespaces

This commit is contained in:
Matthias Schiffer 2015-04-18 00:02:05 +02:00
parent a2a663dafd
commit 6597de68e4
6 changed files with 777 additions and 519 deletions

View file

@ -43,6 +43,7 @@ struct grammar_t {
std::string header_block; std::string header_block;
std::string source_block; std::string source_block;
std::vector<std::string> ns;
std::vector<std::pair<std::string, std::string>> extra_args; std::vector<std::pair<std::string, std::string>> extra_args;

View file

@ -67,6 +67,13 @@ void output_header_t::write() {
write_line(); write_line();
} }
if (!get_generator()->get_grammar().ns.empty()) {
for (const std::string &ns : get_generator()->get_grammar().ns)
write_line("namespace ", ns, " {");
write_line();
}
emit_tokens(); emit_tokens();
write_line(); write_line();
@ -80,6 +87,13 @@ void output_header_t::write() {
write_line_(sig_free()); write_line_(sig_free());
write_line(); write_line();
write_line_(sig_push()); write_line_(sig_push());
if (!get_generator()->get_grammar().ns.empty()) {
write_line();
for (size_t i = 0; i < get_generator()->get_grammar().ns.size(); i++)
write_line("}");
}
} }
}; };

View file

@ -213,6 +213,13 @@ void output_source_t::write() {
write_line(); write_line();
} }
if (!get_generator()->get_grammar().ns.empty()) {
for (const std::string &ns : get_generator()->get_grammar().ns)
write_line("namespace ", ns, " {");
write_line();
}
emit_types(); emit_types();
write_line(); write_line();
@ -229,6 +236,13 @@ void output_source_t::write() {
write_line(); write_line();
emit_push(); emit_push();
if (!get_generator()->get_grammar().ns.empty()) {
write_line();
for (size_t i = 0; i < get_generator()->get_grammar().ns.size(); i++)
write_line("}");
}
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -4,6 +4,8 @@
#include "grammar.hpp" #include "grammar.hpp"
namespace solar {
typedef enum parse_token { typedef enum parse_token {
TOK_BLOCK = 256, TOK_BLOCK = 256,
TOK_CHAR = 257, TOK_CHAR = 257,
@ -23,4 +25,6 @@ typedef struct parse_context parse_context_t;
parse_context_t * parse_alloc(void *(*alloc_func)(size_t)); parse_context_t * parse_alloc(void *(*alloc_func)(size_t));
void parse_free(parse_context_t *parser, void (*free_func)(void *)); void parse_free(parse_context_t *parser, void (*free_func)(void *));
int parse_push(parse_context_t *parser, int token, const parse_token_value_t *value, __attribute__((unused)) solar::grammar_t *grammar); int parse_push(parse_context_t *parser, int token, const parse_token_value_t *value, __attribute__((unused)) grammar_t *grammar);
}

View file

@ -1,10 +1,16 @@
%namespace solar
%header { %header {
#include "grammar.hpp" #include "grammar.hpp"
} }
%source { %source {
namespace solar {
typedef std::vector<std::pair<std::string, bool>> vars_t; typedef std::vector<std::pair<std::string, bool>> vars_t;
typedef std::pair<std::vector<solar::symbol_t>, vars_t> rhs_t; typedef std::pair<std::vector<solar::symbol_t>, vars_t> rhs_t;
}
} }
@ -26,23 +32,26 @@ typedef std::pair<std::vector<solar::symbol_t>, vars_t> rhs_t;
%type CHAR {unsigned char} c %type CHAR {unsigned char} c
%type namespace {std::vector<std::string> *}
%destructor namespace delete
%type rhs {rhs_t *} %type rhs {rhs_t *}
%destructor rhs delete %destructor rhs delete
%type action {std::string *} %type action {std::string *}
%destructor action delete %destructor action delete
%type symbol {solar::symbol_t *} %type symbol {symbol_t *}
%destructor symbol delete %destructor symbol delete
%type term {solar::symbol_t *} %type term {symbol_t *}
%destructor term delete %destructor term delete
%type varname {std::string *} %type varname {std::string *}
%destructor varname delete %destructor varname delete
%extra_arg {__attribute__((unused)) solar::grammar_t *} grammar %extra_arg {__attribute__((unused)) grammar_t *} grammar
grammar |=; grammar |=;
@ -61,6 +70,10 @@ directive |= "%destructor" symbol(sym) varname(name) {
grammar->destructors.insert(std::make_pair(*sym, *name)); grammar->destructors.insert(std::make_pair(*sym, *name));
} }
directive |= "%namespace" namespace(ns) {
grammar->ns = *ns;
}
directive |= "%source" BLOCK(block) { directive |= "%source" BLOCK(block) {
grammar->source_block = *block; grammar->source_block = *block;
} }
@ -74,7 +87,7 @@ directive |= "%extra_arg" BLOCK(type) varname(name) {
} }
directive |= SYMBOL(lhs) "|=" rhs(rhs) action(action) { directive |= SYMBOL(lhs) "|=" rhs(rhs) action(action) {
grammar->add_rule({solar::item_t(*lhs, rhs->first), rhs->second, *action}); grammar->add_rule({item_t(*lhs, rhs->first), rhs->second, *action});
} }
directive |= SYMBOL(lhs) "|=" '(' CHAR(c1) "..." CHAR(c2) ')' ';' { directive |= SYMBOL(lhs) "|=" '(' CHAR(c1) "..." CHAR(c2) ')' ';' {
@ -82,7 +95,7 @@ directive |= SYMBOL(lhs) "|=" '(' CHAR(c1) "..." CHAR(c2) ')' ';' {
vars.emplace_back(); vars.emplace_back();
for (unsigned int c = c1; c <= c2; c++) for (unsigned int c = c1; c <= c2; c++)
grammar->add_rule({solar::item_t(*lhs, {solar::symbol_t::make_char(c)}), vars, std::string()}); grammar->add_rule({item_t(*lhs, {symbol_t::make_char(c)}), vars, std::string()});
} }
@ -111,7 +124,7 @@ rhs |= rhs(=rhs) symbol(sym) '(' '=' varname(var) ')' {
rhs |= rhs(=rhs) STRING(str) { rhs |= rhs(=rhs) STRING(str) {
for (char c : *str) { for (char c : *str) {
rhs->first.push_back(solar::symbol_t::make_char(c)); rhs->first.push_back(symbol_t::make_char(c));
rhs->second.emplace_back(); rhs->second.emplace_back();
} }
@ -124,11 +137,18 @@ action |= BLOCK(=v) [v]
action |= SQBLOCK(v) [new std::string("return " + *v + ";")] action |= SQBLOCK(v) [new std::string("return " + *v + ";")]
symbol |= SYMBOL(v) [new solar::symbol_t(solar::symbol_t::make_nonterm(*v))] namespace |= varname(v) [new std::vector<std::string> {*v}]
namespace |= namespace(=ns) "::" varname(v) {
ns->push_back(*v);
return ns;
}
symbol |= SYMBOL(v) [new symbol_t(symbol_t::make_nonterm(*v))]
symbol |= term(=v) [v] symbol |= term(=v) [v]
term |= SYMBOL_UC(v) [new solar::symbol_t(solar::symbol_t::make_term(*v))] term |= SYMBOL_UC(v) [new symbol_t(symbol_t::make_term(*v))]
term |= CHAR(v) [new solar::symbol_t(solar::symbol_t::make_char(v))] term |= CHAR(v) [new symbol_t(symbol_t::make_char(v))]
varname |= SYMBOL_UC(=v) [v] varname |= SYMBOL_UC(=v) [v]
varname |= SYMBOL(=v) [v] varname |= SYMBOL(=v) [v]