Frage

Was ist der beste Weg, um mehr Flex / Bison-Parser in einem Projekt zu handhaben?

Ich schrieb einen Parser und jetzt brauche ich eine zweite im selben Projekt. Bisher im dritten Abschnitt von parser1.y ich die main(..) Methode eingesetzt und rief yyparse von dort aus.

Was ich will, erhalten, ist mit zwei verschiedenen Parser (parser1.y und parser2.y) und der Lage sein, sie von einer externen Funktion zu nutzen (wir main in main.cpp übernehmen).

Welche Vorsichtsmaßnahmen sollte ich verwenden yyparse Funktionen außerhalb .y Dateien exportiert werden und wie soll ich behandeln zwei Parser?

PS. Ich bin mit g ++ kompiliert, aber nicht die C ++ Versionen von Flex und Bison und ich möchte es auf diese Weise halten (so Einkapseln der Parser innerhalb eines Objekts zu vermeiden).

War es hilfreich?

Lösung

Beachten Sie, dass Bison die '-p zz' Option Präfix Symbole mit 'zz' bietet statt 'JJ'.

In ähnlicher Weise stellt Flex die ‚-P zz‘ Option Präfix Symbole mit ‚zz‘ anstelle von ‚JJ‘. Es nutzt '-p' für Performance-Reporting. ‚Tis schade, sie sind nicht im Einklang miteinander.

Andere Tipps

Neben Leffler Antwort, ich möchte einen anderen Ansatz bieten hier:

In der .lex Datei könnten Sie %option prefix="PREFIX" verwenden, und in der .y Datei könnten Sie %define api.prefix PREFIX, das das gleiche tut wie -p PREFIX zu Bison und -P PREFIX zu Flex vorbei.

Beachten Sie nach dem Überfahren des Standardpräfix yy, können Sie interne Namen Zugriff über sowohl die ursprüngliche yy* und Ihre überschriebene PREFIX*, während offensichtlich für externe Namen müssen Sie Ihre PREFIX* verwenden, um auf sie zuzugreifen.

Wenn Sie Bison 3.0 oder besser verwenden, dann haben Sie einen Blick auf %define api.prefix {foo_}, die alle yy und YY Präfixe mit foo_ und FOO_ ersetzt.

Sehen Sie die Dokumentation über Multiple Parser .

Zwischen Bison 2.6 und 3.0 gibt verwendet keine Klammern sein. %define api.prefix foo_

Die api.prefix Variable arbeiten ist für mich nicht mehr (es ist ein Übersetzungsfehler erzeugt)

%define api.prefix {PREFIX}

Ich hatte die folgende Syntax verwenden

%name-prefix="PREFIX"

Zusätzlich zu dem, was bereits gesagt wurde, wenn Sie ein ‚% definiert api.prefix {PREFIX}‘ verwenden es wird auch yytext && yyparse zu PREFIXtext und PREFIXparse umbenennen. vergessen Sie nicht die {} um das Präfix!
Das gleiche gilt für '% Option prefix = "PREFIX"' in lex, wird Ihr Lexer zu PREFIXlex umbenannt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top