Add support for C++ namespaces
This commit is contained in:
parent
a2a663dafd
commit
6597de68e4
6 changed files with 777 additions and 519 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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("}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -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("}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
1223
src/parse.cpp
1223
src/parse.cpp
File diff suppressed because it is too large
Load diff
|
@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
38
src/parse.y
38
src/parse.y
|
@ -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]
|
||||||
|
|
Reference in a new issue