2016-07-29 9 views
0

Ich habe eine Bison-Grammatik-Datei, die 700 Zeilen lang und wächst; Ich habe versucht, es so gut wie möglich aufzuteilen, aber wenn ich meiner Sprache mehr Komplexität hinzufüge, wird es immer schwieriger, alle Regeln zu verwalten und zu organisieren. Ich habe versucht, nach einer Möglichkeit zu suchen, das Bisonäquivalent von #include oder ähnlichem zu machen, so dass ich es zumindest textuell aufteilen konnte, aber trocken auftauchte. Gibt es eine Möglichkeit für mich, meine Grammatik in kleinere Module aufzuteilen, ohne auf Makefile-Hacks oder ähnliches zurückgreifen zu müssen?Bison-Grammatiken in kleinere Grammatik-Dateien aufteilen

Antwort

2

Bison hat keine Einrichtung analog zu C #include.

Das Hinzufügen eines Präprozessorschritts zu Ihrem Bisonrezept ist kein "Makefile Hack", imho, sondern eher ein erwarteter Anwendungsfall für make.

Es ist ein bisschen schwierig, cpp auf Bison-Dateien zu verwenden, weil sie dazu neigen, #define Direktiven in ihren Prologen zu verwenden, aber es gibt andere Präprozessoren. Für einen einfachen Fall können Sie einfach verwenden.

+0

Ich hatte gehofft, meine interaktive Compilation Feedback in Vim arbeiten zu lassen, aber so geht es. 'Katze' ist es. Vielen Dank! –

0

Statt Aufspaltung der Grammatik selbst, können Sie es kondensieren durch die Regelorgane rufen Funktionen mit zu meist eine Folge von Einzeiler nach unten:

foo : ID bar '{' whatever_list '}' { $$ = ast_node_foo($1, $2, $4); } 
    ; 

Die Einzelheiten der Syntax-directed Übersetzungsschema Rest in diesen Funktionen, die in Module aufgeteilt werden können.

0

btyacc ist eine Variante, die yacc %include lesen aus mehreren Dateien

%include bar.y /* inserts the contents of bar.y at this point */ 

Während btyacc alle POSIX yacc unterstützt unterstützt, unterstützt es nur ein paar Bison Erweiterungen, jedoch.

+0

Interessant. Gibt es Dokumentation über die Unterschiede zwischen Btyacc und Bison? Ich würde gerne bei etwas bleiben, das Pakete für fast jede Distribution hat, ich bin mir nicht sicher, ob die Unterstützung für "% include" genug ist, um mich dazu zu bringen, zu springen. –