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 source_block;
std::vector<std::string> ns;
std::vector<std::pair<std::string, std::string>> extra_args;

View file

@ -67,6 +67,13 @@ void output_header_t::write() {
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();
write_line();
@ -80,6 +87,13 @@ void output_header_t::write() {
write_line_(sig_free());
write_line();
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();
}
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();
write_line();
@ -229,6 +236,13 @@ void output_source_t::write() {
write_line();
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"
namespace solar {
typedef enum parse_token {
TOK_BLOCK = 256,
TOK_CHAR = 257,
@ -23,4 +25,6 @@ typedef struct parse_context parse_context_t;
parse_context_t * parse_alloc(void *(*alloc_func)(size_t));
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 {
#include "grammar.hpp"
}
%source {
namespace solar {
typedef std::vector<std::pair<std::string, bool>> vars_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 namespace {std::vector<std::string> *}
%destructor namespace delete
%type rhs {rhs_t *}
%destructor rhs delete
%type action {std::string *}
%destructor action delete
%type symbol {solar::symbol_t *}
%type symbol {symbol_t *}
%destructor symbol delete
%type term {solar::symbol_t *}
%type term {symbol_t *}
%destructor term delete
%type varname {std::string *}
%destructor varname delete
%extra_arg {__attribute__((unused)) solar::grammar_t *} grammar
%extra_arg {__attribute__((unused)) grammar_t *} grammar
grammar |=;
@ -61,6 +70,10 @@ directive |= "%destructor" symbol(sym) varname(name) {
grammar->destructors.insert(std::make_pair(*sym, *name));
}
directive |= "%namespace" namespace(ns) {
grammar->ns = *ns;
}
directive |= "%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) {
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) ')' ';' {
@ -82,7 +95,7 @@ directive |= SYMBOL(lhs) "|=" '(' CHAR(c1) "..." CHAR(c2) ')' ';' {
vars.emplace_back();
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) {
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();
}
@ -124,11 +137,18 @@ action |= BLOCK(=v) [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]
term |= SYMBOL_UC(v) [new solar::symbol_t(solar::symbol_t::make_term(*v))]
term |= CHAR(v) [new solar::symbol_t(solar::symbol_t::make_char(v))]
term |= SYMBOL_UC(v) [new symbol_t(symbol_t::make_term(*v))]
term |= CHAR(v) [new symbol_t(symbol_t::make_char(v))]
varname |= SYMBOL_UC(=v) [v]
varname |= SYMBOL(=v) [v]