EnglischFranzösischSpanisch

Ad


OnWorks-Favicon

yaccposix – Online in der Cloud

Führen Sie yaccposix im kostenlosen Hosting-Anbieter OnWorks über Ubuntu Online, Fedora Online, den Windows-Online-Emulator oder den MAC OS-Online-Emulator aus

Dies ist der Befehl yaccposix, der beim kostenlosen Hosting-Anbieter OnWorks mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, dem Windows-Online-Emulator oder dem MAC OS-Online-Emulator ausgeführt werden kann

PROGRAMM:

NAME/FUNKTION


yacc – noch ein weiterer Compiler-Compiler (ENTWICKLUNG)

ZUSAMMENFASSUNG


jacc [−dltv] [-b Dateipräfix] [−S sym_prefix] Grammatikkenntnisse

BESCHREIBUNG


Das jacc Das Dienstprogramm soll eine Beschreibung einer kontextfreien Grammatik vorlesen Grammatikkenntnisse und schreibe C
Quellcode, der dem ISO-C-Standard entspricht, in eine Codedatei und optional einen Header
Informationen in eine Header-Datei im aktuellen Verzeichnis. Der generierte Quellcode soll
hängen nicht von undefiniertem, nicht spezifiziertem oder durch die Implementierung definiertem Verhalten ab, außer in
Fälle, in denen es direkt aus der bereitgestellten Grammatik kopiert wird, oder in Fällen, in denen dies der Fall ist
durch die Umsetzung dokumentiert. Der C-Code soll eine Funktion und zugehörige Routinen definieren
und Makros für einen Automaten, der einen Parsing-Algorithmus ausführt, der die Anforderungen in erfüllt
Algorithms.

Form und Bedeutung der Grammatik werden im Abschnitt ERWEITERTE BESCHREIBUNG beschrieben.

Der C-Quellcode und die Header-Datei müssen in einer Form erstellt werden, die als Eingabe für C geeignet ist
Compiler (siehe c99).

OPTIONAL


Das jacc Dienstprogramm muss dem Band der Basisdefinitionen von POSIX.1‐2008 entsprechen, Abschnitt
12.2, Dienstprogramm Syntax Richtlinien, mit Ausnahme von Richtlinie 9.

Folgende Optionen sollen unterstützt werden:

-b Dateipräfix
Verwenden Sie die Dateipräfix statt y als Präfix für alle Ausgabedateinamen. Der Code
Datei y.tab.c, die Header-Datei y.tab.h (erstellt, wenn -d angegeben ist), und die
Beschreibungsdatei y.Ausgabe (erstellt, wenn −v angegeben ist), soll geändert werden in
Dateipräfix.tab.c, Dateipräfix.tab.h und Dateipräfix.Ausgang, Bzw.

-d Schreiben Sie die Header-Datei. Standardmäßig wird nur die Codedatei geschrieben. Der #define
Anweisungen verknüpfen die von zugewiesenen Token-Codes jacc mit dem vom Benutzer deklarierten
Token-Namen. Dies ermöglicht andere Quelldateien als y.tab.c um auf den Token zuzugreifen
Codes.

− l Erstellen Sie eine Codedatei, die keine enthält #Leitung Konstrukte. Wenn diese Option
nicht vorhanden ist, ist nicht angegeben, ob die Codedatei oder die Headerdatei Folgendes enthält
#Leitung Richtlinien. Dies sollte nur nach der Grammatik und den zugehörigen verwendet werden
Aktionen sind vollständig debuggt.

−S sym_prefix
Verwenden Sie die sym_prefix statt yy als Präfix für alle externen Namen, die von erzeugt werden
jacc. Die betroffenen Namen müssen die Funktionen umfassen yyparse() Yylex(), und
yyerror() und die Variablen Yylval, yychar und yydebug. (Im Rest von
In diesem Abschnitt werden die sechs genannten Symbole mit ihren Standardnamen referenziert
(nur zur Vereinfachung der Notation.) Lokale Namen können ebenfalls von dem betroffen sein −S
Möglichkeit; jedoch, die −S Option hat keinen Einfluss #define Symbole generiert von
jacc.

−t Ändern Sie Anweisungen zur bedingten Kompilierung, um die Kompilierung für das Debuggen zu ermöglichen
Code in der Codedatei. Anweisungen zum Laufzeitdebuggen müssen immer in enthalten sein
die Codedatei, aber standardmäßig verhindern bedingte Kompilierungsanweisungen dies
Zusammenstellung.

−v Schreiben Sie eine Datei mit einer Beschreibung des Parsers und einem Konfliktbericht
durch Unklarheiten in der Grammatik erzeugt.

OPERANDEN


Der folgende Operand ist erforderlich:

Grammatikkenntnisse Ein Pfadname einer Datei mit Anweisungen, im Folgenden genannt GrammatikkenntnisseZ.
für den ein Parser erstellt werden soll. Das Format für die Grammatik ist im beschrieben
Abschnitt ERWEITERTE BESCHREIBUNG.

STDIN


Nicht benutzt.

SPEISUNG DATEIEN


Die Datei Grammatikkenntnisse muss eine Textdatei sein, die wie in der ERWEITERTEN BESCHREIBUNG angegeben formatiert ist
.

VARIABLEN


Die folgenden Umgebungsvariablen sollen die Ausführung von jacc:

SPRACHE Geben Sie einen Standardwert für die Internationalisierungsvariablen an, die nicht festgelegt sind oder
Null. (Siehe den Band Basisdefinitionen von POSIX.1‐2008, Abschnitt 8.2,
Internationalisierung Variablen für den Vorrang der Internationalisierung
Variablen, die verwendet werden, um die Werte von Gebietsschemakategorien zu bestimmen.)

LC_ALL Wenn auf einen nicht leeren Zeichenfolgenwert gesetzt, überschreiben Sie die Werte aller anderen
Internationalisierungsvariablen.

LC_CTYPE Bestimmen Sie das Gebietsschema für die Interpretation von Sequenzen von Bytes von Textdaten
als Zeichen (z. B. Einzelbyte- im Gegensatz zu Mehrbyte-Zeichen in
Argumente und Eingabedateien).

LC_MESSAGES
Bestimmen Sie das Gebietsschema, das verwendet werden soll, um das Format und den Inhalt von . zu beeinflussen
Diagnosemeldungen in Standardfehler geschrieben.

NLSPATH Bestimmen Sie den Speicherort von Nachrichtenkatalogen für die Verarbeitung von LC_MESSAGES.

Das SPRACHE und LC_ * Variablen beeinflussen die Ausführung des jacc Dienstprogramm wie angegeben. Der Haupt-()
Funktion definiert in Yacc Bibliothek soll rufen:

setlocale(LC_ALL, "")

und damit das von erzeugte Programm jacc werden durch deren Inhalt ebenfalls berührt
Variablen zur Laufzeit.

ASYNCHRON Events


Standard.

STDOUT


Nicht benutzt.

STDERR


Wenn Shift/Reduce- oder Reduce/Reduce-Konflikte erkannt werden Grammatikkenntnisse, jacc soll a schreiben
Melden Sie diese Konflikte in einem nicht spezifizierten Format an den Standardfehler.

Auch für Diagnosemeldungen ist der Standardfehler zu verwenden.

AUSGABE DATEIEN


Die Codedatei, die Headerdatei und die Beschreibungsdatei müssen Textdateien sein. Alle sind
in den folgenden Abschnitten beschrieben.

Code Reichen Sie das
Diese Datei muss den C-Quellcode für enthalten yyparse()-Funktion. Es soll enthalten
Code für die verschiedenen semantischen Aktionen mit durchgeführter Makrosubstitution als
im Abschnitt „ERWEITERTE BESCHREIBUNG“ beschrieben. Es muss auch eine Kopie davon enthalten #define
Anweisungen in der Header-Datei. Wenn ein %Union Deklaration verwendet wird, die Deklaration für
YYSTYPE muss ebenfalls in dieser Datei enthalten sein.

Kopfzeile Reichen Sie das
Die Header-Datei muss enthalten #define Anweisungen, die die Token-Nummern mit dem verknüpfen
Token-Namen. Dadurch können andere Quelldateien als die Codedatei auf die Token-Codes zugreifen.
Sollten Sie jetzt aufgefordert werden, ein %Union Deklaration verwendet wird, die Deklaration für YYSTYPE und eine extern JYSTYP Yylval
Die Erklärung ist ebenfalls in diese Datei aufzunehmen.

Beschreibung Reichen Sie das
Die Beschreibungsdatei muss eine Textdatei sein, die eine Beschreibung des Zustandsautomaten enthält
entsprechend dem Parser, unter Verwendung eines nicht spezifizierten Formats. Grenzen für interne Tabellen (siehe
Limits) sind ebenfalls in einer umsetzungsdefinierten Weise zu melden. (Einige Implementierungen
können dynamische Allokationstechniken verwenden und haben keine spezifischen Grenzwerte zu melden.)

VERLÄNGERT BESCHREIBUNG


Das jacc Der Befehl akzeptiert eine Sprache, die zum Definieren einer Grammatik für eine Zielsprache verwendet wird
von den Tabellen und dem generierten Code analysiert werden jacc. Die von akzeptierte Sprache jacc als ein
Die Grammatik für die Zielsprache wird im Folgenden anhand der beschrieben jacc Eingabesprache selbst.

Die Eingabe Grammatikkenntnisse Enthält Regeln, die die Eingabestruktur der Zielsprache beschreiben und
Code, der aufgerufen werden soll, wenn diese Regeln erkannt werden, um die zugehörige Semantik bereitzustellen
Aktion. Der auszuführende Code muss in Form von Textkörpern erscheinen, die C-codiert werden sollen.
Sprachcode. Diese Textkörper dürfen keine C-Sprach-Trigraphen enthalten. Die C-Sprache
Es wird davon ausgegangen, dass Einschlüsse eine korrekte Funktion bilden, wenn sie verarbeitet werden jacc in seine Ausgabe ein
Dateien. Der so eingebundene Code soll bei der Erkennung des ausgeführt werden
Zielsprache.

Gegeben eine Grammatik, die jacc Das Dienstprogramm generiert die in den AUSGABEDATEIEN beschriebenen Dateien
Abschnitt. Die Codedatei kann mit kompiliert und verknüpft werden c99. Wenn die Erklärung und
Programmabschnitte der Grammatikdatei enthielten keine Definitionen von Haupt-() Yylex(), und
yyerror(), erfordert die kompilierte Ausgabe eine Verknüpfung mit extern bereitgestellten Versionen davon
Funktionen. Standardversionen von Haupt-() und yyerror() werden im bereitgestellt jacc Bibliothek und
können mit dem eingebunden werden − l y Operand zu c99dem „Vermischten Geschmack“. Seine jacc Bibliotheksschnittstellen müssen dies nicht tun
Unterstützt Schnittstellen mit anderen als den Standardschnittstellen yy Symbolpräfix. Die Anwendung bietet
die lexikalische Analysefunktion, Yylex(); Die lex Das Dienstprogramm wurde speziell dafür entwickelt
Generieren Sie eine solche Routine.

zufuhr Sprache
Die Anwendung muss sicherstellen, dass jede Spezifikationsdatei aus drei Abschnitten besteht
Auftrag: Erklärungen, Grammatikkenntnisse Ohne eine erfahrene Medienplanung zur Festlegung von Regeln und Strategien beschleunigt der programmatische Medieneinkauf einfach die Rate der verschwenderischen Ausgaben. und Programme, durch Doppel getrennt
Zeichen ("%%"). Die Abschnitte „Deklarationen“ und „Programme“ können leer sein. Wenn Letzteres der Fall ist
leer, das Vorhergehende "%%" Die Markierung, die es vom Regelteil trennt, kann weggelassen werden.

Bei der Eingabe handelt es sich um Freiformtext, der der Struktur der unten definierten Grammatik folgt.

Lexikalisch Struktur of Grammatik
Der , , Und Zeichen werden ignoriert, es sei denn, das
Bei der Anwendung muss sichergestellt werden, dass sie nicht in Namen oder mit mehreren Zeichen vorkommen
Symbole. Kommentare sind beizufügen "/* ... */"und kann überall dort erscheinen, wo ein Name steht
gültig.

Namen haben eine beliebige Länge und bestehen aus Buchstaben, Punkten ('.'), Unterstriche ('_'), Und
Nicht-Anfangsziffern. Groß- und Kleinbuchstaben sind unterschiedlich. Konforme Anwendungen
dürfen keine Namen verwenden, die mit beginnen yy or YY Da die jacc Der Parser verwendet solche Namen. Viele von
Die Namen erscheinen in der endgültigen Ausgabe von jaccund daher sollten sie konform gewählt werden
mit allen zusätzlichen Regeln, die vom C-Compiler erstellt wurden und verwendet werden sollen. Insbesondere erscheinen sie
in #define Aussagen.

Ein Literal muss aus einem einzelnen Zeichen bestehen, das in einfache Anführungszeichen eingeschlossen ist. Alle
Die vom ISO-C-Standard für Zeichenkonstanten unterstützten Escape-Sequenzen müssen sein
unterstützt durch jacc.

Die Beziehung zum lexikalischen Analysator wird im Folgenden ausführlich besprochen.

Die Anwendung muss sicherstellen, dass das NUL-Zeichen nicht in Grammatikregeln oder verwendet wird
Literale.

Erklärungen Abschnitt
Im Abschnitt „Deklarationen“ werden die Symbole definiert, die zur Definition der Zielsprache verwendet werden
und ihre Beziehung zueinander. Insbesondere viele zusätzliche Informationen
erforderlich, um Mehrdeutigkeiten in der kontextfreien Grammatik für die Zielsprache aufzulösen
hier zur Verfügung gestellt.

Gewöhnlich jacc weist die Beziehung zwischen den von ihm generierten symbolischen Namen und ihren zu
zugrunde liegender numerischer Wert. Der Deklarationsabschnitt ermöglicht die Steuerung der
Zuordnung dieser Werte.

Es ist auch möglich, semantische Informationen zu den aktuell aktivierten Token beizubehalten
den Parse-Stack in einer benutzerdefinierten C-Sprache Gewerkschaft, wenn die Mitglieder der Gewerkschaft sind
mit den verschiedenen Namen in der Grammatik verbunden. Der Abschnitt „Deklarationen“ sieht vor
das auch.

Die erste Gruppe von Deklaratoren unten akzeptiert alle eine Liste von Namen als Argumente. Diese Liste kann
optional muss der Name eines C-Union-Mitglieds (genannt a) vorangestellt werden Etikett unten) erscheint
. '<' und '>'. (Als Ausnahme von den typografischen Konventionen des Rests
Band von POSIX.1‐2008, in diesem FallEtikett> stellt keine Metavariable dar, sondern die
wörtliche spitze Klammerzeichen, die ein Symbol umgeben.) Die Verwendung von Etikett gibt an, dass die
In dieser Zeile genannte Token müssen vom gleichen C-Typ sein wie das Gewerkschaftsmitglied, auf das verwiesen wird
Etikett. Dies wird weiter unten ausführlicher besprochen.

Bei Listen, die zum Definieren von Token verwendet werden, kann auf das erste Erscheinen eines bestimmten Tokens gefolgt werden
eine positive ganze Zahl (als Folge von Dezimalziffern). Wenn dies geschieht, der zugrunde liegende Wert
Die ihr für lexikalische Zwecke zugewiesene Nummer gilt als diese Nummer.

Das Folgende erklärt Name ein Zeichen sein:

%Zeichen [<Etikett>] Name [Anzahl] [Name [Anzahl]]...

If Etikett vorhanden ist, soll der C-Typ für alle Token in dieser Zeile als Typ deklariert werden
referenziert von Etikett. Wenn eine positive ganze Zahl, Anzahl, folgt a Name, dieser Wert soll sein
dem Token zugeordnet.

Das Folgende erklärt Name um ein Token zu sein, und weist ihm Vorrang zu:

%links [<Etikett>] Name [Anzahl] [Name [Anzahl]]...
%Rechts [<Etikett>] Name [Anzahl] [Name [Anzahl]]...

In diesem Abschnitt können eine oder mehrere Zeilen erscheinen, die jeweils mit einem dieser Symbole beginnen.
Alle Token in derselben Zeile haben die gleiche Prioritätsstufe und Assoziativität; Die Linien
sind in der Reihenfolge zunehmender Priorität oder Bindungsstärke geordnet. %links bezeichnet, dass die
Operatoren in dieser Zeile bleiben assoziativ und %Rechts bezeichnet ebenfalls rechts
Assoziative Operatoren. Wenn Etikett vorhanden ist, soll ein C-Typ für deklariert werden Names wie beschrieben
für %Zeichen.

Das Folgende erklärt Name ein Token zu sein und weist darauf hin, dass dieser nicht verwendet werden kann
assoziativ:

%nonassoc [<Etikett>] Name [Anzahl] [Name [Anzahl]]...

Wenn der Parser auf eine assoziative Verwendung dieses Tokens stößt, meldet er einen Fehler. Wenn Etikett is
vorhanden ist, soll ein C-Typ deklariert werden Names wie beschrieben für %Zeichen.

Im Folgenden wird dieses Gewerkschaftsmitglied erklärt Names sind Nicht-Terminals und daher erforderlich
Ein ... Haben Etikett Feld am Anfang:

%Typ <Etikett> Name...

Da es sich nur um Nicht-Terminals handelt, ist die Zuweisung einer Token-Nummer oder die Verwendung eines Literals sinnvoll
auch verboten. Wenn dieses Konstrukt vorhanden ist, jacc führt eine Typprüfung durch; wenn das
Konstrukt nicht vorhanden ist, soll der Parse-Stack nur das enthalten int Art.

Jeder Name, der in verwendet wird Grammatikkenntnisse nicht definiert durch a %Zeichen, %links, %Rechts, oder %nonassoc
Es wird davon ausgegangen, dass die Deklaration ein nichtterminales Symbol darstellt. Der jacc Das Versorgungsunternehmen soll Bericht erstatten
ein Fehler für jedes nicht-terminale Symbol, das nicht auf der linken Seite von mindestens einem erscheint
Grammatikregel.

Sobald der Typ, die Priorität oder die Token-Nummer eines Namens angegeben sind, ist dies nicht der Fall
geändert. Wenn die erste Deklaration eines Tokens keine Token-Nummer zuweist, jacc wird
Weisen Sie eine Token-Nummer zu. Sobald diese Zuordnung erfolgt ist, darf die Token-Nummer nicht mehr geändert werden
durch ausdrückliche Zuweisung.

Die folgenden Deklaratoren folgen nicht dem vorherigen Muster.

Im Folgenden wird das Nicht-Terminal deklariert Name um als Anfang Symbol, die das darstellt
größte und allgemeinste Struktur, die durch die Grammatikregeln beschrieben wird:

%Anfang Name

Standardmäßig ist es die linke Seite der ersten Grammatikregel; dieser Standardwert kann sein
mit dieser Deklaration überschrieben.

Im Folgenden wird das erklärt jacc Der Wertstapel soll eine Vereinigung der verschiedenen Arten von Werten sein
erwünscht.

%Union { Körper of Gewerkschaft (in C)}

Der Körper der Union darf keine unausgeglichenen Vorverarbeitungstoken in geschweiften Klammern enthalten.

Standardmäßig sollen die von Aktionen (siehe unten) und dem lexikalischen Analysator zurückgegebenen Werte sein
oder Typ intdem „Vermischten Geschmack“. Seine jacc Das Dienstprogramm verfolgt die Typen und fügt die entsprechenden ein
Union-Mitgliedsnamen, um eine strenge Typprüfung des resultierenden Parsers durchzuführen.

Alternativ vorausgesetzt, dass mindestens eineEtikett> Konstrukt verwendet wird, kann die Union deklariert werden
in einer Header-Datei (die mithilfe von a in den Deklarationsabschnitt eingefügt werden soll). #einschließen
innen konstruieren %{ und %}), und ein typedef Wird verwendet, um das darzustellende Symbol YYSTYPE zu definieren
diese Gewerkschaft. Der Effekt von %Union besteht darin, die Deklaration von YYSTYPE direkt bereitzustellen
jacc Eingang.

C-Sprachdeklarationen und -Definitionen können im beigefügten Abschnitt „Deklarationen“ angezeigt werden
durch folgende Kennzeichen:

%{ ... %}

Diese Anweisungen müssen in die Codedatei kopiert werden und haben darin globale Gültigkeit
dass sie in den Regeln und Programmteilen verwendet werden können. Die Aussagen enthalten keine
„%}“ außerhalb eines Kommentars, eines Zeichenfolgenliterals oder einer Konstante mit mehreren Zeichen.

Die Anwendung muss sicherstellen, dass der Deklarationsabschnitt durch das Token beendet wird %%.

Grammatik Regeln in jacc
Der Regelabschnitt definiert die kontextfreie Grammatik, die von der Funktion akzeptiert werden soll jacc
generiert und ordnet diesen Regeln C-Sprachaktionen und zusätzliche Prioritäten zu
Information. Nachfolgend wird die Grammatik beschrieben und es folgt eine formale Definition.

Der Regelabschnitt besteht aus einer oder mehreren Grammatikregeln. Eine Grammatikregel hat die Form:

A : BODY ;

Das Symbol A stellt einen nicht-terminalen Namen dar und BODY stellt eine Folge von Null oder dar
mehr Names, wörtlichs, und semantisch Aktions, auf die dann optional folgen kann
Vorrang regierenS. An der Bildung sind nur die Namen und Literale beteiligt
Grammatik; Die semantischen Aktionen und Vorrangregeln werden auf andere Weise verwendet. Der Und
Die Sind jacc Interpunktion. Wenn es mehrere aufeinanderfolgende Grammatikregeln mit gibt
die gleiche linke Seite, die ('|') kann verwendet werden, um ein Umschreiben zu vermeiden
links; in diesem Fall die erscheint erst nach der letzten Regel. Der Körper
Der Teil kann leer sein (oder keine Namen und Literale enthalten), um anzuzeigen, dass es sich um ein Nicht-Terminal handelt
Das Symbol entspricht der leeren Zeichenfolge.

Das jacc Das Dienstprogramm weist jeder Regel eine eindeutige Nummer zu. Regeln mit der vertikalen Leiste
Notation sind unterschiedliche Regeln. Die der Regel zugewiesene Nummer erscheint in der Beschreibung
Datei.

Die Elemente, aus denen ein KÖRPER besteht, sind:

Name, wörtlich
Diese bilden die Regeln der Grammatik: Name ist entweder ein Zeichen oder eine nicht-terminal;
wörtlich steht für sich selbst (abzüglich der lexikalisch erforderlichen Anführungszeichen).

semantisch Aktion
Der Benutzer kann jeder Grammatikregel Aktionen zuordnen, die jedes Mal ausgeführt werden sollen
die Regel wird im Eingabeprozess erkannt. (Beachten Sie, dass das Wort „Aktion“ Folgendes tun kann
beziehen sich auch auf die Aktionen des Parsers – verschieben, reduzieren usw.)

Diese Aktionen können Werte zurückgeben und die von previous zurückgegebenen Werte abrufen
Aktionen. Diese Werte werden in Objekten vom Typ YYSTYPE gehalten (siehe %Union). Die
Der Ergebniswert der Aktion soll auf dem Parse-Stack mit der linken Hand gehalten werden
Seite der Regel, auf die andere Reduzierungen als Teil ihrer rechten Seite zugreifen können
Seite. Durch die Verwendung derEtikett> Informationen im Abschnitt „Erklärungen“, die
Code generiert von jacc kann streng typgeprüft sein und beliebige Elemente enthalten
Information. Darüber hinaus kann der lexikalische Analysator die gleichen Arten von bereitstellen
Werte für Token, falls gewünscht.

Eine Aktion ist eine beliebige C-Anweisung und kann als solche Eingaben oder Ausgaben bzw. Aufrufe ausführen
Unterprogramme und ändern externe Variablen. Eine Aktion besteht aus einer oder mehreren C-Anweisungen
in geschweifte Klammern eingeschlossen '{' und '}'. Die Aussagen enthalten keine
unausgeglichene Vorverarbeitungstoken in geschweiften Klammern.

In der Aktion können bestimmte Pseudovariablen verwendet werden. Dies sind Makros für den Zugriff
auf Datenstrukturen, die intern bekannt sind jacc.

$$ Der Wert der Aktion kann durch Zuweisen zu $$ festgelegt werden. Wenn Typ
Die Prüfung ist aktiviert und der Typ des zuzuweisenden Werts kann nicht angegeben werden
ermittelt, kann eine Diagnosemeldung generiert werden.

$Anzahl Dies bezieht sich auf den Wert, der von der durch die angegebenen Komponente zurückgegeben wird
Zeichen Anzahl auf der rechten Seite einer Regel, von links nach rechts lesend;
Anzahl kann Null oder negativ sein. Wenn Anzahl ist Null oder negativ, es
bezieht sich auf die mit dem Namen verknüpften Daten auf dem Stapel des Parsers
vor dem Symbol ganz links der aktuellen Regel. (Das ist, "$ 0"
bezieht sich auf den Namen, der unmittelbar vor dem Namen ganz links steht
aktuelle Regel, die auf dem Stapel des Parsers zu finden ist und „$−1“ bezieht sich auf
Symbol zu seine links.) Wenn Anzahl bezieht sich auf ein Element nach dem aktuellen
Punkt in der Regel oder jenseits des unteren Randes des Stapels ist das Ergebnis
nicht definiert. Wenn die Typprüfung aktiviert ist und der Typ des Werts angegeben werden soll
Wenn der zugeordnete Fehler nicht ermittelt werden kann, wird möglicherweise eine Diagnosemeldung generiert.

$<Etikett>Anzahl
Diese entsprechen exakt den entsprechenden Symbolen ohne die Etikett
Einbindung, ermöglichen aber eine strenge Typprüfung (und schließen unerwünschte aus).
Typkonvertierungen). Der Effekt besteht darin, dass das Makro zur Verwendung erweitert wird Etikett
um ein Element aus der YYSTYPE-Union auszuwählen (mit datenname.tag).
Dies ist besonders nützlich, wenn Anzahl ist nicht positiv.

$<Etikett>$ Dies legt der Referenz den Typ des referenzierten Gewerkschaftsmitglieds fest
by Etikett. Diese Konstruktion ist anwendbar, wenn auf eine Linke verwiesen wird
Kontextwert kommt in der Grammatik vor und bietet jacc mit einem Mittel
zur Auswahl eines Typs.

Aktionen können überall in einer Regel erfolgen (nicht nur am Ende); Eine Aktion kann zugreifen
Werte, die von Aktionen auf der linken Seite zurückgegeben werden, und der zurückgegebene Wert kann wiederum sein
Der Zugriff erfolgt über Aktionen auf der rechten Seite. Eine Aktion, die in der Mitte einer Regel erscheint
entspricht dem Ersetzen der Aktion durch ein neues nichtterminales Symbol und
Hinzufügen einer leeren Regel mit diesem nichtterminalen Symbol auf der linken Seite. Der
Die mit der neuen Regel verbundene semantische Aktion muss der ursprünglichen entsprechen
Aktion. Die Verwendung von Aktionen innerhalb von Regeln könnte zu Konflikten führen, bei denen dies nicht der Fall wäre
sonst existieren.

Standardmäßig ist der Wert einer Regel der Wert des ersten Elements darin.
Wenn das erste Element keinen Typ hat (insbesondere im Fall von a
Literal) und die Typprüfung wird durch aktiviert %Typ, wird eine Fehlermeldung ausgegeben.

Vorrang
Das Schlüsselwort %prec kann verwendet werden, um die mit a verknüpfte Prioritätsstufe zu ändern
bestimmte Grammatikregel. Beispiele hierfür sind Fälle, in denen ein unärer und ein binärer Wert vorliegen
Operator haben die gleiche symbolische Darstellung, müssen aber unterschiedlich angegeben werden
Präzedenzfälle oder wo die Behandlung einer mehrdeutigen if-else-Konstruktion erfolgt
notwendig. Das reservierte Symbol %prec kann unmittelbar nach dem Körper erscheinen
die Grammatikregel und kann von einem Tokennamen oder einem Literal gefolgt werden. Es sollte
bewirken, dass die Priorität der Grammatikregel die des folgenden Tokens wird
Name oder Literal. Die Aktion für die Regel als Ganzes kann folgen %prec.

Folgt ein Programmabschnitt, muss die Anwendung darauf achten, dass die Grammatikregeln eingehalten werden
beendet durch %%.

Programme Abschnitt
Das Programme Der Abschnitt kann die Definition des lexikalischen Analysators enthalten Yylex() und alle
andere Funktionen; zum Beispiel diejenigen, die in den in den Grammatikregeln angegebenen Aktionen verwendet werden. Es
ist nicht angegeben, ob der Abschnitt „Programme“ den semantischen Aktionen in vorangeht oder folgt
die Ausgabedatei; Wenn die Anwendung daher Makrodefinitionen enthält und
Deklarationen, die auf den Code in den semantischen Aktionen angewendet werden sollen, werden diese platziert
. „%{ ... %}" im Abschnitt „Deklarationen“.

zufuhr Grammatik
Die folgende Eingabe an jacc ergibt einen Parser für die Eingabe an jacc. Diese formale Syntax
hat Vorrang vor der vorangehenden Beschreibung der Textsyntax.

Die lexikalische Struktur ist weniger präzise definiert; Lexikalisch Struktur of Grammatik definiert
die meisten Begriffe. Die Entsprechung zwischen den vorherigen Bedingungen und den folgenden Token ist wie folgt
folgt.

IDENTIFIKATOR Dies entspricht dem Konzept von Name, zuvor gegeben. Es beinhaltet auch
Literale wie zuvor definiert.

C_IDENTIFIER
Dies ist ein Name, und außerdem ist bekannt, dass ihm ein folgt . A
Literal kann dieses Token nicht liefern.

NUMBER Eine Ziffernfolge (eine nicht negative dezimale Ganzzahl).

TYP, LINKS, MARK, LCURL, RCURL
Diese entsprechen direkt %Typ, %links, %%, %{ und %}.

{ ... } Dies weist auf C-Sprachquellcode mit der möglichen Einbeziehung von hin '$'
Makros wie zuvor besprochen.

/* Grammatik für Eingabe zu yacc. */
/* Basic Einträge. */
/* Das Folgende sind anerkannt by lexikalisch Analysator. */

%token IDENTIFIER /* Enthält Bezeichner und Literale */
%token C_IDENTIFIER /* Bezeichner (aber kein Literal)
gefolgt von einem :. */
%token NUMBER /* [0-9][0-9]* */

/* Reservierte Wörter: %type=>TYPE %left=>LEFT usw. */

%token LINKS RECHTS NONASSOC TOKEN PREC TYPE START UNION

%token MARK /* Die %%-Marke. */
%token LCURL /* Die %{-Marke. */
%token RCURL /* Die %}-Marke. */

/* 8-Bit-Zeichenliterale stehen für sich selbst; */
/* Token müssen für Multibyte-Zeichen definiert werden. */

%start spec

%%

spec: defs MARK regiert den Schwanz
;
Schwanz: MARK
{
/* Richten Sie in dieser Aktion den Rest der Datei ein. */
}
| /* Leer; Das zweite MARK ist optional. */
;
defs : /* Leer. */
| defs def
;
def: START-IDENTIFIER
| UNION
{
/* Union-Definition in Ausgabe kopieren. */
}
| LCURL
{
/* C-Code in die Ausgabedatei kopieren. */
}
RCURL
| rword-Tag nlist
;
Wort: TOKEN
| LINKS
| RECHTS
| NONASSOC
| TYP
;
tag : /* Leer: Union-Tag-ID optional. */
| '<' IDENTIFIER '>'
;
nlist: nmnr
| nlist nmnr
;
nmno: IDENTIFIER /* Hinweis: Literal ungültig mit %-Typ. */
| IDENTIFIERNUMMER /* Hinweis: ungültig mit %-Typ. */
;

/* Regelabschnitt */

Regeln: C_IDENTIFIER rbody prec
| Regeln regeln
;
Regel: C_IDENTIFIER rbody prec
| '|' Körperpräz
;
rbody : /* leer */
| rbody IDENTIFIER
| Körper handeln
;
Gesetz : '{'
{
/* Aktion kopieren, $$ übersetzen usw. */
}
'}'
;
prec : /* Leer */
| PREC-IDENTIFIER
| PREC IDENTIFIER Akt
| prec ';'
;

Konflikte
Der für eine Eingabegrammatik erstellte Parser kann Zustände enthalten, in denen Konflikte auftreten. Der
Konflikte entstehen, weil die Grammatik nicht stimmt Lalr(1). Eine mehrdeutige Grammatik enthält immer
mindestens ein Lalr(1) Konflikt. Der jacc Das Dienstprogramm soll alle Konflikte lösen, indem es eines von beiden verwendet
Standardregeln oder benutzerdefinierte Vorrangregeln.

Konflikte sind entweder Verschiebungs-/Reduzierungskonflikte oder Reduzierungs-/Reduzierungskonflikte. Eine Verschiebung/Reduzierung
Bei einem Konflikt handelt es sich um einen Konflikt, bei dem für einen gegebenen Zustand und ein bestimmtes Lookahead-Symbol sowohl eine Verschiebungsaktion als auch ein
Maßnahmenreduzierungen sind möglich. Ein Reduzieren/Reduzieren-Konflikt liegt vor, wenn für einen bestimmten Zustand und
Lookahead-Symbol, Kürzungen nach zwei unterschiedlichen Regeln sind möglich.

Die folgenden Regeln beschreiben, wie Sie festlegen, welche Maßnahmen bei Auftreten eines Konflikts ergriffen werden sollen. Nicht
Alle Verschiebungs-/Reduzierungskonflikte können auf diese Weise erfolgreich gelöst werden, da der Konflikt möglicherweise
kann auf etwas anderes als Mehrdeutigkeit zurückzuführen sein, so dass ein unvorsichtiger Gebrauch dieser Einrichtungen dazu führen kann
Die vom Parser akzeptierte Sprache weicht stark von der beabsichtigten Sprache ab. Der
Die Beschreibungsdatei muss ausreichende Informationen enthalten, um die Ursache zu verstehen
Konflikt. Wo Mehrdeutigkeit der Grund ist, sollten entweder die Standardregeln oder explizite Regeln gelten
ausreichend, um einen funktionierenden Parser zu erstellen.

Die erklärten Präzedenzfälle und Assoziativitäten (siehe Erklärungen Abschnitt) sind gewöhnt an
Lösen Sie Parsing-Konflikte wie folgt:

1. Mit jeder Grammatikregel ist eine Priorität und Assoziativität verbunden. es ist der
Vorrang und Assoziativität des letzten Tokens oder Literals im Regelkörper. Wenn
%prec Wenn das Schlüsselwort verwendet wird, überschreibt es diese Standardeinstellung. Bei einigen Grammatikregeln ist dies möglicherweise nicht der Fall
haben sowohl Vorrang als auch Assoziativität.

2. Wenn ein Verschiebungs-/Reduzierungskonflikt vorliegt, und sowohl die Grammatikregel als auch das Eingabesymbol
Wenn mit ihnen Vorrang und Assoziativität verbunden sind, ist der Konflikt gelöst
zugunsten der Aktion (Verschieben oder Reduzieren), die mit der höheren Priorität verbunden ist. Wenn die
Wenn die Prioritäten gleich sind, wird die Assoziativität verwendet. linksassoziativ impliziert
reduzieren, rechtsassoziativ impliziert eine Verschiebung und nichtassoziativ impliziert einen Fehler in der
Zeichenfolge, die analysiert wird.

3. Wenn es einen Verschiebungs-/Reduzierungskonflikt gibt, der nicht durch Regel 2 gelöst werden kann, erfolgt die Verschiebung
Erledigt. Auf diese Weise gelöste Konflikte werden in der unter beschriebenen Diagnoseausgabe gezählt
Fehler Handling.

4. Wenn es einen Reduzieren/Reduzieren-Konflikt gibt, erfolgt eine Reduzierung durch die Grammatikregel that
tritt früher in der Eingabesequenz auf. Auf diese Weise gelöste Konflikte werden mitgezählt
Diagnoseausgabe beschrieben in Fehler Handling.

Durch Vorrang oder Assoziativität gelöste Konflikte werden bei der Verschiebung/Reduzierung nicht berücksichtigt
und die von gemeldeten Konflikte reduzieren/reduzieren jacc entweder auf dem Standardfehler oder im
Beschreibungsdatei.

Fehler Handling
Das Zeichen Fehler sind der Fehlerbehandlung vorbehalten. Der Name Fehler kann verwendet werden in
Grammatik regeln. Es zeigt Stellen an, an denen der Parser einen Syntaxfehler beheben kann. Der
Standardwert von Fehler soll 256 sein. Sein Wert kann mit a geändert werden %Zeichen Erklärung.
Der lexikalische Analysator sollte den Wert von nicht zurückgeben Fehler.

Der Parser muss einen Syntaxfehler erkennen, wenn er sich in einem Zustand befindet, in dem die Aktion zugeordnet ist
mit dem Lookahead-Symbol ist Fehler. Eine semantische Aktion kann dazu führen, dass der Parser initiiert wird
Fehlerbehandlung durch Ausführung des Makros YYERROR. Wenn YYERROR ausgeführt wird, wird die Semantik
Die Aktion übergibt die Kontrolle zurück an den Parser. YYERROR kann nicht außerhalb der Semantik verwendet werden
Aktionen.

Wenn der Parser einen Syntaxfehler erkennt, ruft er normalerweise auf yyerror() mit dem Zeichen
Schnur "Syntax Fehler" als sein Argument. Der Aufruf darf nicht erfolgen, wenn der Parser stillsteht
Wiederherstellung nach einem früheren Fehler, wenn der Fehler erkannt wird. Der Parser gilt als
wird sich von einem früheren Fehler erholen, bis der Parser mindestens drei Fehler überschritten hat
normale Eingabesymbole, seit der letzte Fehler erkannt wurde oder eine semantische Aktion ausgeführt wurde
das Makro yyerrok. Der Parser darf nicht aufgerufen werden yyerror(), wenn YYERROR ausgeführt wird.

Die Makrofunktion YYRECOVERING soll 1 zurückgeben, wenn ein Syntaxfehler erkannt wurde und der
Der Parser hat sich davon noch nicht vollständig erholt. Andernfalls wird Null zurückgegeben.

Wenn der Parser einen Syntaxfehler erkennt, prüft der Parser, ob eine vorherige Syntax vorliegt
Fehler wurde erkannt. Wenn ein früherer Fehler erkannt wurde und keine normalen Eingabesymbole vorhanden sind
verschoben wurden, seit der vorhergehende Fehler erkannt wurde, prüft der Parser, ob die
Das Lookahead-Symbol ist ein Endmarker (siehe Schnittstelle zu Lexikalisch Analyzer). Wenn ja, dann
Der Parser muss einen Wert ungleich Null zurückgeben. Andernfalls muss das Lookahead-Symbol sein
verworfen und die normale Analyse wird fortgesetzt.

Wenn YYERROR ausgeführt wird oder wenn der Parser einen Syntaxfehler und keinen vorherigen Fehler erkennt
erkannt wurde oder mindestens ein normales Eingabesymbol seit dem vorherigen verschoben wurde
Wenn ein Fehler erkannt wurde, springt der Parser jeweils um einen Zustand zurück, bis der Analysestapel wieder verfügbar ist
leer oder der aktuelle Zustand erlaubt eine Umschaltung Fehler. Wenn der Parser die Analyse leert
Stapel, es soll mit einem Wert ungleich Null zurückgegeben werden. Andernfalls wird es verschoben Fehler und
Fahren Sie dann mit der normalen Analyse fort. Wenn der Parser ein Lookahead-Symbol liest, bevor der Fehler auftrat
erkannt wurde, soll dieses Symbol weiterhin das Lookahead-Symbol sein, wenn die Analyse fortgesetzt wird.

Das Makro yyerrok in einer semantischen Aktion soll den Parser dazu veranlassen, sich so zu verhalten, als ob er dies vollständig getan hätte
alle vorherigen Fehler behoben. Das Makro yyclearin soll dazu führen, dass der Parser verwirft
das aktuelle Lookahead-Token. Wenn das aktuelle Lookahead-Token noch nicht gelesen wurde,
yyclearin soll keine Wirkung haben.

Das Makro YYACCEPT soll den Parser dazu veranlassen, mit dem Wert Null zurückzukehren. Das Makro YYABORT
soll dazu führen, dass der Parser einen Wert ungleich Null zurückgibt.

Schnittstelle zu Lexikalisch Analyzer
Das Yylex()-Funktion ist eine ganzzahlige Funktion, die a zurückgibt Zeichen Anzahl
stellt die Art des gelesenen Tokens dar. Wenn dem Token ein Wert zugeordnet ist
zurückgegeben von Yylex() (siehe die Diskussion von Etikett oben) ist es dem zuzuordnen
externe Variable Yylval.

Wenn der Parser und Yylex() stimmen diesen Token-Nummern nicht zu, zuverlässige Kommunikation
zwischen ihnen kann es nicht vorkommen. Für (Einzelbyte-Zeichen-)Literale ist das Token einfach das
numerischer Wert des Zeichens im aktuellen Zeichensatz. Die Nummern für andere Token
kann entweder von gewählt werden jacc, oder vom Benutzer ausgewählt. In jedem Fall ist die #define konstruieren
von C wird verwendet, um zu ermöglichen Yylex(), um diese Zahlen symbolisch zurückzugeben. Der #define Aussagen
werden in die Codedatei und die Header-Datei eingefügt, falls diese Datei angefordert wird. Der Satz von
Zeichen erlaubt durch jacc in einem Bezeichner ist größer als der von C. Token zulässige Wert
Namen, die solche Zeichen enthalten, dürfen nicht in die Liste aufgenommen werden #define Erklärungen.

Wenn die Token-Nummern von ausgewählt werden jacc, werden die anderen Token als Literale zugewiesen
Zahlen größer als 256, obwohl keine Reihenfolge angegeben ist. Ein Token kann explizit zugewiesen werden
eine Zahl, indem Sie ihrem ersten Erscheinen im Deklarationsabschnitt eine Zahl folgen lassen.
Namen und Literale, die nicht auf diese Weise definiert sind, behalten ihre Standarddefinition. Alle Token-Nummern
zugeteilt von jacc müssen eindeutig sein und sich von den für Literale und verwendeten Token-Nummern unterscheiden
Vom Benutzer zugewiesene Token. Wenn doppelte Token-Nummern zu Konflikten bei der Parser-Generierung führen,
jacc soll einen Fehler melden; andernfalls ist nicht angegeben, ob die Tokenzuweisung erfolgt
akzeptiert oder es wird ein Fehler gemeldet.

Das Ende der Eingabe wird durch ein spezielles Token namens gekennzeichnet Endmarker, das einen Token hat
Zahl, die Null oder negativ ist. (Diese Werte sind für alle anderen Token ungültig.) Alle
Lexikalische Analysatoren müssen bei Erreichen des Endes Null oder negativ als Token-Zahl zurückgeben
ihren Beitrag. Wenn die Token bis zum Endmarker, jedoch ausschließlich, eine Struktur bilden, die
mit dem Startsymbol übereinstimmt, muss der Parser die Eingabe akzeptieren. Wenn der Endmarker sichtbar ist
In jedem anderen Kontext gilt dies als Fehler.

Abschluss Programm
Zusätzlich zu den Modi yyparse() und Yylex(), die Funktionen yyerror() und Haupt-() werden benötigt, um
Erstellen Sie ein vollständiges Programm. Die Anwendung kann liefern Haupt-() und yyerror(), oder jene
Routinen können von der bezogen werden jacc Bibliothek.

Yacc Bibliothek
Die folgenden Funktionen sollen nur im erscheinen jacc Bibliothek zugänglich über die − l y
Operand zu c99; Sie können daher durch eine konforme Anwendung neu definiert werden:

int Haupt-(ungültig)
Diese Funktion soll aufgerufen werden yyparse() und beenden Sie mit einem nicht angegebenen Wert. Andere Aktionen
innerhalb dieser Funktion sind nicht spezifiziert.

int yyerror(const verkohlen *s)
Diese Funktion soll das NUL-terminierte Argument in den Standardfehler schreiben, gefolgt von
A .

Die Reihenfolge der − l y und − l l Operanden gegeben an c99 ist wichtig; Der Antrag soll
entweder sein eigenes zur Verfügung stellen Haupt-() funktionieren oder sicherstellen, dass − l y vorangeht − l l.

Fehlerbeseitigung Parser
Der von generierte Parser jacc Es muss optional über Diagnosemöglichkeiten verfügen
entweder zur Kompilierungszeit oder zur Laufzeit aktiviert (sofern zur Kompilierungszeit aktiviert). Der
Die Kompilierung des Laufzeit-Debugging-Codes unterliegt der Kontrolle von YYDEBUG, einem Präprozessor
Symbol. Wenn YYDEBUG einen Wert ungleich Null hat, muss der Debugging-Code einbezogen werden. Wenn es
Ist der Wert Null, darf der Code nicht einbezogen werden.

In Parsern, in denen der Debugging-Code eingebunden wurde, ist der externe int yydebug kann sein
Wird verwendet, um das Debuggen zur Laufzeit ein- (mit einem Wert ungleich Null) und auszuschalten (Wert Null). Der
Anfangswert von yydebug soll Null sein.

Wann −t angegeben ist, muss die Codedatei so erstellt werden, dass YYDEBUG nicht bereits vorhanden ist
zur Kompilierungszeit definiert (unter Verwendung der c99 -D YYDEBUG-Option zum Beispiel), YYDEBUG soll
explizit auf 1 gesetzt werden. Wann −t nicht angegeben ist, muss die Codedatei so erstellt werden, dass
Wenn YYDEBUG nicht bereits definiert ist, muss es explizit auf Null gesetzt werden.

Das Format der Debugging-Ausgabe ist nicht spezifiziert, enthält aber zumindest genügend Informationen
um die Verschiebungs- und Reduzierungsaktionen sowie die Eingabesymbole zu bestimmen. Es bietet auch
Informationen zur Fehlerbehebung.

Algorithms
Der von erstellte Parser jacc implementiert ein Lalr(1) Parsing-Algorithmus wie in dokumentiert
die Literatur. Es ist nicht angegeben, ob der Parser tabellengesteuert oder direkt codiert ist.

Ein Parser, der von generiert wird jacc wird niemals ein Eingabesymbol anfordern von Yylex() während in a
Zustand, in dem die einzigen Aktionen außer der Fehleraktion Reduzierungen durch eine einzelne Regel sind.

Die Literatur zur Parsing-Theorie definiert diese Konzepte.

Limits
Das jacc Das Dienstprogramm kann mehrere interne Tabellen haben. Die Mindest-Höchstwerte für diese Tabellen
sind in der folgenden Tabelle aufgeführt. Die genaue Bedeutung dieser Werte ist Implementierung-
definiert. Die Implementierung muss die Beziehung zwischen diesen Werten und zwischen definieren
Sie und alle Fehlermeldungen, die die Implementierung möglicherweise generiert, falls sie zur Neige geht
Platz für jede interne Struktur. Eine Implementierung kann Gruppen dieser Ressourcen kombinieren
in einen einzigen Pool, solange die dem Benutzer zur Verfügung stehende Gesamtsumme nicht unter die Summe fällt
der in diesem Abschnitt angegebenen Größen.

Table: Intern Limits in jacc

┌───────────┬─────────┬───────────────── ───────────────┐
│ │ Mindestens │ │
BegrenzenMaximalBeschreibung
├───────────┼─────────┼───────────────── ────────── ─────┤
│{NTERMS} │ 126 │ Anzahl der Token. │
│{NNONTERM} │ 200 │ Anzahl der Nichtterminals. │
│{NPROD} │ 300 │ Anzahl der Regeln. │
│{NSTATES} │ 600 │ Anzahl der Staaten. │
│{MEMSIZE} │ 5200 │ Länge der Regeln. Die Summe │
│ │ │ Länge, in Namen (Tokens und │
│ │ │ Nichtterminale) aller │
│ │ │ Regeln der Grammatik. Das │
│ │ │ linke Seite wird für │ gezählt
│ │ │ jede Regel, auch wenn dies nicht der Fall ist │
│ │ │ explizit wiederholt, als │
│ │ │ angegeben in Grammatik Regeln in
│ │ │ jacc. │.
│{ACTSIZE} │ 4000 │ Anzahl der Aktionen. „Aktionen“ │
│ │ │ hier (und in der Beschreibung │
│ │ │ Datei) beziehen sich auf Parser-Aktionen │
│ │ │ (Verschieben, Reduzieren usw.) nicht │
│ │ │ zu den in │ definierten semantischen Aktionen
│ │ │ Grammatik Regeln in jacc. │.
└───────────┴─────────┴───────────────── ───────────────┘

EXIT STATUS


Die folgenden Exit-Werte sollen zurückgegeben werden:

0 Erfolgreicher Abschluss.

>0 Es ist ein Fehler aufgetreten.

FOLGEN OF FEHLER


Wenn Fehler auftreten, wird der Lauf abgebrochen und jacc wird mit einem Status ungleich Null beendet.
Es können Teilcodedateien und Headerdateien erstellt werden. Die zusammenfassenden Informationen in der
Beschreibungsdatei wird immer erstellt, wenn die −v Flagge ist vorhanden.

Das Folgende Abschnitte sind informativ.

Anmeldeformular ANWENDUNG


Bei historischen Implementierungen kam es zu Namenskonflikten bei den Namen yacc.tmp, yacc.acts,
yacc.debug, y.tab.c, y.tab.h und y.Ausgabe wenn mehr als eine Kopie von jacc läuft in a
einzelnes Verzeichnis gleichzeitig. Der -b Option wurde hinzugefügt, um dieses Problem zu lösen. Der
damit verbundenes Problem, mehrere zuzulassen jacc Parser, die in derselben Datei platziert werden sollten
adressiert durch Hinzufügen von a −S Option zum Überschreiben der zuvor hartcodierten Option yy Variables Präfix.

Die Beschreibung der −S Die Option gibt den minimalen Satz an Funktions- und Variablennamen an
die zu Konflikten führen, wenn mehrere Parser miteinander verbunden sind. YYSTYPE muss nicht sein
geändert. Stattdessen kann der Programmierer verwenden -b um die Header-Dateien für verschiedene Parser bereitzustellen
verschiedene Namen, und dann die Datei mit dem Yylex() für einen bestimmten Parser kann das enthalten
Header für diesen Parser. Namen wie yyclearerr müssen nicht geändert werden, da sie
werden nur in den Aktionen verwendet; Sie haben keine Verbindung. Es ist möglich, dass ein
Implementierung hat andere Namen, entweder interne Namen für die Implementierung von Dingen wie
yyclearerroder Bereitstellung nicht standardmäßiger Funktionen, die geändert werden sollen −S.

Unäre Operatoren, die dasselbe Token wie ein binärer Operator haben, benötigen im Allgemeinen ihre
Vorrang angepasst. Dies wird von der erledigt %prec Hinweissymbol im Zusammenhang mit dem
bestimmte Grammatikregel, die diesen unären Operator definiert. (Sehen Grammatik Regeln in jacc.)
Anwendungen müssen diesen Operator nicht für unäre Operatoren verwenden, sondern die Grammatiken
die es nicht erfordern, sind selten.

Beispiele:


Zugriff auf die jacc Die Bibliothek wird mit Bibliothekssuchoperanden abgerufen c99. So verwenden Sie die
jacc Bibliothek Haupt-

c99 y.tab.c − l y

Beide lex Bibliothek und die jacc Bibliothek enthalten Haupt-(). Um auf die zuzugreifen jacc Haupt-

c99 y.tab.c lex.yy.c − l y − l l

Dies stellt sicher, dass die jacc Die Bibliothek wird zuerst durchsucht, sodass sie Haupt-() wird eingesetzt.

Das historische jacc Bibliotheken enthalten zwei einfache Funktionen, die normalerweise codiert sind
durch den Anwendungsprogrammierer. Diese Funktionen ähneln dem folgenden Code:

#einschließen
int main(void)
{
extern int yyparse();

setlocale(LC_ALL, "");

/* Wenn der folgende Parser von Lex erstellt wurde, wird der
Die Anwendung muss darauf achten, dass LC_CTYPE
und LC_COLLATE sind auf das POSIX-Gebietsschema festgelegt. */
(void) yyparse();
zurück (0);
}

#einschließen

int yyerror(const char *msg)
{
(void) fprintf(stderr, "%s\n", msg);
zurück (0);
}

RATIONALE


Die Referenzen in Referenziert Dokumente kann beim Aufbau des Parsers hilfreich sein
Generator. Der referenzierte Artikel von DeRemer und Pennello (zusammen mit den darin enthaltenen Arbeiten).
Referenzen) beschreibt eine Technik zum Generieren von Parsern, die diesem Band entsprechen
POSIX.1‐2008. In diesem Bereich wird weiterhin gearbeitet, daher sollten sich die Implementierer beraten
Lesen Sie die aktuelle Literatur, bevor Sie neue Implementierungen vornehmen. Der ursprüngliche Knuth-Artikel ist der
theoretische Grundlage für diese Art von Parser, aber die von ihm generierten Tabellen sind unpraktisch
groß für vernünftige Grammatiken und sollte nicht verwendet werden. Die Formulierung „entspricht“ lautet
Absichtlich sicherzustellen, dass die besten Tische vorhanden sind Lalr(1) generiert werden kann.

Es gab Verwirrung zwischen der Klasse der Grammatiken und den zur Generierung erforderlichen Algorithmen
Parser und die zum Parsen der Sprachen erforderlichen Algorithmen. Sie sind alle vernünftig
senkrecht. Insbesondere ein Parser-Generator, der die gesamte Palette von akzeptiert LR(1)
Grammatiken müssen keine komplexere Tabelle generieren als eine, die akzeptiert SLR(1) (ein
relativ schwache Klasse von LR-Grammatiken) für eine Grammatik, die es zufällig gibt SLR(1). So ein
Auch die Umsetzung muss den Fall nicht anerkennen; Tabellenkomprimierung kann das ergeben SLR(1)
Tabelle (oder eine noch kleinere) ohne zu erkennen, dass die Grammatik vorhanden ist SLR(1). Das
Geschwindigkeit eines LR(1) Der Parser für jede Klasse hängt mehr von der Tabellendarstellung ab und
Komprimierung (oder die Codegenerierung, wenn ein direkter Parser generiert wird) als auf der Klasse
der Grammatik, die der Tabellengenerator verarbeitet.

Die Geschwindigkeit des Parser-Generators hängt in gewissem Maße von der Grammatikklasse ab, die er verwendet
Griffe. Die ursprünglichen Algorithmen des Knuth-Artikels zum Erstellen von LR-Parsern waren jedoch
wurde von seinem Autor damals als unpraktisch langsam beurteilt. Obwohl volles LR mehr ist
komplex als Lalr(1) Je besser Computergeschwindigkeiten und Algorithmen werden, desto größer wird der Unterschied (in Begriffen).
akzeptabler Ausführungszeit der Wanduhr) verliert an Bedeutung.

Potenzielle Autoren werden darauf hingewiesen, dass auf den Artikel von DeRemer und Pennello verwiesen wird
Das zuvor zitierte Beispiel identifiziert einen Fehler (eine übermäßige Vereinfachung der Berechnung von Lalr(1)
Lookahead-Sets) in einigen der Lalr(1) Algorithmusanweisungen, die ihm vorangegangen sind
Veröffentlichung. Sie sollten sich die Zeit nehmen, dieses Papier sowie aktuelle relevante Dokumente zu durchsuchen
Arbeit, insbesondere Aho's.

Das -b Die Option wurde hinzugefügt, um eine tragbare Methode für die Genehmigung bereitzustellen jacc an etwas arbeiten
mehrere separate Parser im selben Verzeichnis. Wenn ein Verzeichnis mehrere enthält
jacc Grammatik, und beide Grammatiken werden gleichzeitig konstruiert (z. B. durch a
Parallel um Programm), Konfliktergebnisse. Obwohl die Lösung keine historische Praxis ist,
Es behebt einen bekannten Mangel in historischen Implementierungen. Entsprechende Änderungen gab es
für alle Abschnitte vorgenommen, die auf die Dateinamen verwiesen haben y.tab.c (jetzt „die Codedatei“),
y.tab.h (jetzt „die Header-Datei“) und y.Ausgabe (jetzt „die Beschreibungsdatei“).

Die Grammatik für jacc Die Eingabe basiert auf der System V-Dokumentation. Die Textbeschreibung
zeigt dort, dass die ';' ist am Ende der Regel erforderlich. Die Grammatik und die
Für die Umsetzung ist dies nicht erforderlich. (Die Verwendung von C_IDENTIFIER bewirkt, dass eine Reduzierung auftritt
der richtige Ort.)

Außerdem sind in dieser Implementierung die Konstrukte wie %Zeichen kann durch a beendet werden
, aber dies ist grammatikalisch nicht zulässig. Die Schlüsselwörter wie %Zeichen kann
erscheinen auch in Großbuchstaben, was wiederum nicht besprochen wird. An den meisten Orten, wo '%' wird genutzt,
können ersetzt werden, und für einige der Symbole gibt es alternative Schreibweisen
(zum Beispiel, %LINKS kann sein „%<“ oder „\<“).

Historisch,Etikett> kann beliebige Zeichen enthalten, außer '>', einschließlich Leerzeichen, in der
Implementierung. Da jedoch die Etikett muss auf ein ISO-C-Standard-Gewerkschaftsmitglied verweisen, in
Praxiskonforme Implementierungen müssen nur den Zeichensatz für ISO C unterstützen
Standard-Identifikatoren in diesem Zusammenhang.

Es ist bekannt, dass einige historische Implementierungen Aktionen akzeptieren, die durch a beendet werden
Zeitraum. Historische Implementierungen erlauben es oft '$' in Namen. Eine konforme Implementierung
muss keines dieser Verhaltensweisen unterstützen.

Entscheiden Sie, wann Sie es verwenden möchten %prec verdeutlicht die Schwierigkeit, das Verhalten von zu spezifizieren jacc.
Es kann Situationen geben, in denen die Grammatikkenntnisse ist streng genommen kein Irrtum, und doch
jacc kann es nicht eindeutig interpretieren. Die Auflösung von Mehrdeutigkeiten in der Grammatik kann
In vielen Fällen lässt sich das Problem durch die Bereitstellung zusätzlicher Informationen, z. B. der Verwendung, lösen %Typ or
%Union Erklärungen. Dies ist oft einfacher und führt normalerweise zu einem kleineren Parser
diese Alternative, wenn sie angemessen ist.

Die Größe und Ausführungszeit eines Programms, das ohne den Laufzeit-Debugging-Code erstellt wurde, beträgt
in historischen Implementierungen normalerweise kleiner und etwas schneller.

Zu den Statistikmeldungen mehrerer historischer Implementierungen gehören die folgenden Typen
Informationen:

n/512-Terminals, n/300 Nicht-Terminals
n/600 Grammatikregeln, n/1500 Staaten
n verschieben/reduzieren, n gemeldete Konflikte reduzieren/reduzieren
n/350 Arbeitssätze verwendet
Gedächtnis: Zustände usw. n/15000, Parser n/ 15000
n/600 verschiedene Lookahead-Sets
n zusätzliche Verschlüsse
n Schichteinträge, n Ausnahmen
n Gehe zu Einträgen
n Einträge werden standardmäßig gespeichert
Verwendeter Optimiererraum: Eingabe n/15000, Ausgabe n/ 15000
n Tabelleneinträge, n Null
Maximale Streuung: n, Maximaler Versatz: n

Der Bericht interner Tabellen in der Beschreibungsdatei bleibt durch die Implementierung definiert
denn alle Aspekte dieser Grenzwerte sind auch durch die Implementierung definiert. Einige Implementierungen
können dynamische Allokationstechniken verwenden und haben keine spezifischen Grenzwerte zu melden.

Das Format der y.Ausgabe Die Datei wird nicht angegeben, da das Format nicht angegeben wurde
Es wird davon ausgegangen, dass es die Portabilität von Anwendungen verbessert. Die Auflistung soll in erster Linie der menschlichen Hilfe dienen
Benutzer verstehen und debuggen den Parser; Gebrauch von y.Ausgabe durch ein konformes Anwendungsskript
wäre ungewöhnlich. Darüber hinaus haben Implementierungen keine konsistente Ausgabe erzeugt und nein
Das beliebte Format war offensichtlich. Das von der Implementierung ausgewählte Format sollte menschlich sein.
lesbar sein, zusätzlich zu der Anforderung, dass es sich um eine Textdatei handelt.

Standardfehlerberichte werden nicht speziell beschrieben, da sie selten von Nutzen sind
konforme Anwendungen und es gab keinen Grund, Implementierungen einzuschränken.

Einige Implementierungen erkennen „={“ als äquivalent zu '{' weil es in der Geschichte erscheint
Dokumentation. Diese Konstruktion wurde schon vor langer Zeit als veraltet erkannt und dokumentiert
1978, in der verwiesen Yacc: noch Ein anderer Compiler-Compiler. Dieser Band von POSIX.1‐2008
Ich habe beschlossen, es als veraltet zu belassen und wegzulassen.

Multibyte-Zeichen sollten vom lexikalischen Analysator erkannt und als Token zurückgegeben werden.
Sie sollten nicht als Multibyte-Zeichenliterale zurückgegeben werden. Der Token Fehler das wird gebraucht
Für die Fehlerbehebung wird in der historischen Implementierung normalerweise der Wert 256 zugewiesen.
Daher ist der Tokenwert 256, der in vielen Multibyte-Zeichensätzen verwendet wird, nicht der Fall
zur Verwendung als Wert eines benutzerdefinierten Tokens verfügbar.

ZUKUNFT RICHTUNGEN


Keiner.

Nutzen Sie yaccposix online über die Dienste von onworks.net


Kostenlose Server & Workstations

Laden Sie Windows- und Linux-Apps herunter

  • 1
    itop – ITSM CMDB OpenSource
    itop – ITSM CMDB OpenSource
    IT Operations Portal: ein vollständig geöffnetes
    Source, ITIL, webbasierter Service
    Management-Tool einschließlich einer vollständig
    anpassbare CMDB, ein Helpdesk-System und
    ein Dokumentarmann...
    Laden Sie itop - ITSM CMDB OpenSource herunter
  • 2
    Clementine
    Clementine
    Clementine ist eine Multi-Plattform-Musik
    Player und Bibliotheksorganisator inspiriert von
    Amarok 1.4. Es hat eine schnelle und
    einfach zu bedienende Oberfläche und ermöglicht es Ihnen
    suchen und ...
    Clementine herunterladen
  • 3
    XISMus
    XISMus
    ACHTUNG: Kumulatives Update 2.4.3 hat
    freigegeben worden!! Das Update funktioniert bei jedem
    vorherige Version 2.xx. Wenn Sie upgraden
    ab Version v1.xx bitte herunterladen und
    i ...
    Laden Sie XISmuS herunter
  • 4
    facetracknoir
    facetracknoir
    Modulares Headtracking-Programm, das
    unterstützt mehrere Face-Tracker, Filter
    und Spielprotokolle. Unter den Trackern
    sind die SM FaceAPI, AIC Inertial Head
    Verfolger ...
    facetracknoir herunterladen
  • 5
    PHP-QR-Code
    PHP-QR-Code
    PHP-QR-Code ist Open Source (LGPL)
    Bibliothek zum Generieren von QR-Code,
    2-dimensionaler Strichcode. Beyogen auf
    libqrencode C-Bibliothek, bietet API für
    QR-Code-Barc erstellen...
    Laden Sie den PHP-QR-Code herunter
  • 6
    freibürgerlich
    freibürgerlich
    Freeciv ist ein kostenloses rundenbasiertes Spiel
    Multiplayer-Strategiespiel, in dem jeder
    Der Spieler wird zum Anführer von a
    Zivilisation, die darum kämpft, die zu erhalten
    Endziel: zu ...
    Laden Sie Freeciv herunter
  • Mehr »

Linux-Befehle

Ad