Ich arbeite daran, meine Parse-Datenstruktur aus Bisons semantischen Werten zu konstruieren. Eine bestimmte Struktur ist vom Typ std::vector<double>
. Ich bin gespannt, wie die Bison-Interna semantische Werte bewegen. Ich versuchte, die C++ m4-Datei zu analysieren und gefunden:.Bison value moving/efficiency
template <typename Base>
inline
void
]b4_parser_class_name[::basic_symbol<Base>::move (basic_symbol& s)
{
super_type::move(s);
]b4_variant_if([b4_symbol_variant([this->type_get()], [value], [move],
[s.value])],
[value = s.value;])[]b4_locations_if([
location = s.location;])[
}
Leider habe ich nicht entziffern kann fast genug, um die Effizienz der Bewegung eine Datenstruktur wie std :: vector zu entziffern, zum Teil meiner Unkenntnis des Grund m4 Syntax.
Vor diesem Hintergrund in meiner Grammatik:
%define api.token.constructor
%define api.value.type variant
%type < std::vector<double> > numlist
...
numlist:
num { $$ = std::vector<double>(); $$.push_back($1); }
| numlist "," num { $$ = $1; $$.push_back($3); }
;
Ich bin der Auswirkungen auf die Leistung ungewiss. Beachten Sie, dass dies mit einem C++ 98-Compiler und nicht mit einem C++ 11-Compiler kompiliert wird; daher wird es keine Bewegungssemantik geben.
Ich vermute, dass die $$ = std::vector<double>()
Anweisung entfernt werden konnte; Ich nehme an, es wäre bereits default-konstruiert, aber ich habe es nicht getestet und bin mir nicht sicher, wie Bisons interner Variant-Typ funktioniert. Was mich besonders interessiert, ist die $$ = $1; $$.push_back($3);
Wird der Vektor für jedes hinzuzufügende Objekt kopiert?
Ich kann nicht feststellen, ob dies für das Umschalten des Typs auf std::vector<double> *
ist; zugegebenermaßen bestand ein großer Teil der Gründe für die Verwendung des Bison-Variantentyps in der Verwendung einfacher C++ - Typen anstelle einer Vereinigung von Zeigern.
Ich habe auch ähnliche Kuriositäten auf einem Parser, der in der Tat tut Verwendung von C++ 14.11 und insbesondere std::unique_ptr
machen. Wenn eine Zeile einer linksrekursiven Regel zugewiesen wäre, beispielsweise $$ = std::make_unique<...>(...)
, wäre Folgendes möglich: $$ = $1; $$->...
?
Danke! Ich wollte wirklich vermeiden, das Pointer-zu-Vektor-Konstrukt zu machen, aber es sieht so aus, als ob das das Beste ist. – Zac
@Zac hast du erwogen, '$ 1' und' $$' zu tauschen, anstatt zuzuteilen? –
@Michael hatte ich nicht. Beziehen Sie sich auf std :: swap()? – Zac