angielskufrancuskihiszpański

Uruchom serwery | Ubuntu > | Fedora > |


Ulubiona usługa OnWorks

yaccposix — online w chmurze

Uruchom yaccposix u dostawcy bezpłatnego hostingu OnWorks przez Ubuntu Online, Fedora Online, emulator online Windows lub emulator online MAC OS

To jest polecenie yaccposix, które można uruchomić u dostawcy bezpłatnego hostingu OnWorks przy użyciu jednej z naszych wielu darmowych stacji roboczych online, takich jak Ubuntu Online, Fedora Online, emulator online Windows lub emulator online MAC OS

PROGRAM:

IMIĘ


yacc — kolejny kompilator kompilatora (ROZWÓJ)

STRESZCZENIE


Yacc [−dltv] [−b prefiks_pliku] [−p sym_prefiks] gramatyka

OPIS


W ramach projektu Yacc narzędzie przeczyta opis gramatyki bezkontekstowej w gramatyka i napisz C
kod źródłowy, zgodny ze standardem ISO C, do pliku kodu i opcjonalnie nagłówka
informacje do pliku nagłówkowego w bieżącym katalogu. Wygenerowany kod źródłowy powinien:
nie zależy od niezdefiniowanego, nieokreślonego lub zdefiniowanego przez implementację zachowania, z wyjątkiem
przypadki, w których jest on kopiowany bezpośrednio z dostarczonej gramatyki lub w przypadkach, które są
udokumentowane wdrożeniem. Kod C powinien definiować funkcję i powiązane procedury
oraz makra dla automatu realizującego algorytm parsowania spełniający wymagania w
Algorytmy.

Forma i znaczenie gramatyki zostały opisane w rozdziale OPIS ROZSZERZONY.

Kod źródłowy C i plik nagłówkowy powinny być tworzone w formie odpowiedniej jako dane wejściowe dla C
kompilator (patrz c99).

OPCJE


W ramach projektu Yacc narzędzie powinno być zgodne z woluminem Base Definitions POSIX.1-2008, Sekcja
12.2, Użyteczność Składnia Wytyczne, z wyjątkiem wytycznej 9.

Obsługiwane będą następujące opcje:

−b prefiks_pliku
Zastosowanie prefiks_pliku zamiast y jako przedrostek dla wszystkich nazw plików wyjściowych. Kod
filet y.tab.c, plik nagłówkowy y.tab.h (utworzony, gdy −d jest określony), a
plik opisu y.wyjście (utworzony, gdy −v jest określony), należy zmienić na
prefiks_pliku.tab.c, prefiks_pliku.tab.h, prefiks_pliku.wyjście, Odpowiednio.

−d Napisz plik nagłówkowy; domyślnie zapisywany jest tylko plik kodu. ten #definiować
wyciągi kojarzą kody tokenów przypisane przez Yacc z zadeklarowanym przez użytkownika
nazwy tokenów. Pozwala to na pliki źródłowe inne niż y.tab.c aby uzyskać dostęp do tokena
kody.

−l Utwórz plik kodu, który nie zawiera żadnych #linia konstrukcje. Jeśli ta opcja
nie istnieje, nie jest określone, czy plik z kodem, czy plik nagłówkowy zawiera
#linia dyrektywy. Powinno to być używane tylko po gramatyce i skojarzeniu
akcje są w pełni debugowane.

−p sym_prefiks
Zastosowanie sym_prefiks zamiast yy jako przedrostek dla wszystkich nazw zewnętrznych produkowanych przez
Yacc. Nazwy, których to dotyczy, obejmują funkcje yyparse() yylex(), oraz
yybłąd() i zmienne Yylval, Yychar, yydebug. (W pozostałej części
w tej sekcji sześć cytowanych symboli jest przywoływanych za pomocą ich domyślnych nazw
tylko jako udogodnienie notacyjne). Na nazwy lokalne może mieć również wpływ −p
opcja; Jednakże −p opcja nie wpłynie #definiować symbole generowane przez
Yacc.

−t Zmodyfikuj dyrektywy kompilacji warunkowej, aby umożliwić kompilację debugowania
kod w pliku kodu. Instrukcje debugowania w czasie wykonywania zawsze powinny być zawarte w
plik kodu, ale domyślnie dyrektywy warunkowej kompilacji uniemożliwiają ich
kompilacja.

−v Napisz plik zawierający opis parsera i raport o konfliktach
generowane przez niejasności w gramatyce.

OPERANDY


Wymagany jest następujący argument:

gramatyka Ścieżka do pliku zawierającego instrukcje, zwana dalej gramatyka, Dla
który ma zostać utworzony parser. Format gramatyki jest opisany w
Sekcja ROZSZERZONY OPIS.

STDIN


Nieużywany.

WEJŚCIE AKTA


Plik gramatyka powinien być plikiem tekstowym sformatowanym zgodnie z opisem w ROZSZERZONYM OPISIE
Sekcja.

ŚRODOWISKO ZMIENNE


Następujące zmienne środowiskowe mają wpływ na wykonanie Yacc:

JĘZYK Podaj wartość domyślną dla zmiennych internacjonalizacji, które nie są ustawione lub
zero. (Patrz tom Definicje podstawowe POSIX.1‐2008, Sekcja 8.2,
Umiędzynarodowienie Zmienne o pierwszeństwo internacjonalizacji
zmienne używane do określania wartości kategorii ustawień regionalnych).

LC_ALL Jeśli jest ustawiony na niepustą wartość ciągu, nadpisz wartości wszystkich pozostałych
zmienne internacjonalizacji.

LC_CTYPE Określ lokalizację dla interpretacji sekwencji bajtów danych tekstowych
jako znaki (na przykład jednobajtowe w przeciwieństwie do wielobajtowych znaków w
argumenty i pliki wejściowe).

LC_MESSAGES
Określ ustawienia regionalne, które powinny być używane do wpływania na format i zawartość
komunikaty diagnostyczne zapisywane z błędem standardowym.

NLSPATH Określ lokalizację katalogów wiadomości do przetwarzania LC_MESSAGES.

W ramach projektu JĘZYK i LC_* zmienne wpływają na wykonanie Yacc użyteczność jak podano. ten główny()
funkcja zdefiniowana w Yacc Biblioteka wezwie:

setlocale(LC_ALL, „”)

a tym samym program wygenerowany przez Yacc ma również wpływ na treść tych
zmienne w czasie wykonywania.

ASYNCHRONICZNY WYDARZENIA


Domyślna.

STDOUT


Nieużywany.

STDERR


Jeśli konflikty przesunięcia/zmniejszenia lub zmniejszenia/zmniejszenia zostaną wykryte w gramatyka, Yacc napiszę
zgłoś te konflikty do standardowego błędu w nieokreślonym formacie.

Błąd standardowy powinien być również używany do komunikatów diagnostycznych.

WYDAJNOŚĆ AKTA


Plik kodowy, plik nagłówkowy i plik opisowy powinny być plikami tekstowymi. Wszyscy są
opisane w kolejnych sekcjach.

Kod filet
Ten plik powinien zawierać kod źródłowy C dla yyparse() funkcja. Powinien zawierać:
kod dla różnych akcji semantycznych z wykonywanymi na nich podstawieniami makr jako
opisane w rozdziale OPIS ROZSZERZONY. Zawiera również kopię #definiować
oświadczenia w pliku nagłówkowym. Jeśli %unia używana jest deklaracja, deklaracja dla
YYSTYPE będzie również zawarty w tym pliku.

Nagłówek filet
Plik nagłówkowy powinien zawierać: #definiować oświadczenia, które kojarzą numery tokenów z
nazwy tokenów. Dzięki temu pliki źródłowe inne niż plik kodu mają dostęp do kodów tokenów.
Jeśli %unia używana jest deklaracja, deklaracja dla YYSTYPE i an zewnętrzny YYSTYP Yylval
oświadczenie powinno być również zawarte w tym pliku.

Opis filet
Plik opisu powinien być plikiem tekstowym zawierającym opis maszyny stanowej
odpowiadające parserowi, przy użyciu nieokreślonego formatu. Limity dla tabel wewnętrznych (patrz
Limity) należy również zgłaszać w sposób określony przez wdrożenie. (Niektóre realizacje
mogą korzystać z technik dynamicznej alokacji i nie muszą zgłaszać konkretnych wartości granicznych).

ROZSZERZONY OPIS


W ramach projektu Yacc polecenie akceptuje język używany do definiowania gramatyki dla języka docelowego
do przeanalizowania przez tabele i kod wygenerowany przez Yacc. Język akceptowany przez Yacc jak
gramatyka dla języka docelowego jest opisana poniżej za pomocą Yacc sam język wprowadzania.

Wejście gramatyka zawiera reguły opisujące strukturę wejściową języka docelowego oraz
kod, który ma zostać wywołany, gdy te reguły zostaną rozpoznane, aby zapewnić skojarzoną semantykę
akcja. Kod do wykonania powinien pojawić się jako treść tekstu, który ma być C-
kod języka. Te części tekstu nie mogą zawierać trigrafów w języku C. Język C
Zakłada się, że wtrącenia tworzą prawidłową funkcję, gdy są przetwarzane przez Yacc do jego wyjścia
pliki. Zawarty w ten sposób kod zostanie wykonany podczas rozpoznawania
język docelowy.

Biorąc pod uwagę gramatykę, Yacc narzędzie generuje pliki opisane w PLIKI WYJŚCIOWE
Sekcja. Plik kodu można skompilować i połączyć za pomocą c99. Jeśli deklaracja i
sekcje programów w pliku gramatycznym nie zawierały definicji główny() yylex(), oraz
yybłąd(), skompilowane dane wyjściowe wymagają połączenia z zewnętrznie dostarczonymi wersjami tych
Funkcje. Domyślne wersje główny() i yybłąd() są dostarczane w Yacc biblioteka i
można połączyć za pomocą −l y operand do c99, Yacc interfejsy biblioteczne nie muszą
obsługuje interfejsy z innymi niż domyślne yy przedrostek symbolu. Aplikacja zapewnia
funkcja analizatora leksykalnego, yylex(); ten lex narzędzie jest specjalnie zaprojektowane, aby
generować taką rutynę.

Wkład język polski lub języki obce
Wniosek zapewnia, że ​​każdy plik specyfikacji składa się z trzech sekcji w
zamówienie: Oświadczenia, gramatyka reguły, programów, oddzielone podwójnymi
postacie ("%%"). Sekcje deklaracji i programów mogą być puste. Jeśli to drugie jest
pusty, poprzedni "%%" znak oddzielający go od sekcji reguł można pominąć.

Dane wejściowe są tekstem w dowolnej formie, zgodnie ze strukturą gramatyki zdefiniowanej poniżej.

Leksykalny Structure of die,en Gramatyka
ten , , oraz znak powinien być ignorowany, z wyjątkiem tego, że
zgłoszenie zapewnia, że ​​nie pojawiają się one w nazwach lub zastrzeżonych wieloznakowych
symbolika. Uwagi należy zamieścić w "/* ... */", i może pojawić się wszędzie tam, gdzie jest nazwa
ważny.

Nazwy mają dowolną długość, składają się z liter, kropek ('.'), podkreślenia ('_'), A
cyfry inne niż początkowe. Wielkie i małe litery są różne. Zgodne aplikacje
nie używa nazw zaczynających się na yy or YY ponieważ Yacc parser używa takich nazw. Wiele
nazwiska pojawiają się w końcowym wyniku Yacc, a zatem powinny być wybrane tak, aby były zgodne
z wszelkimi dodatkowymi regułami utworzonymi przez kompilator C do użycia. W szczególności pojawiają się
in #definiować sprawozdania.

Literał składa się z pojedynczego znaku ujętego w znaki pojedynczego cudzysłowu. Wszystkie z
sekwencje specjalne obsługiwane dla stałych znakowych przez normę ISO C powinny być:
wspierany przez Yacc.

Związek z analizatorem leksykalnym omówiono szczegółowo poniżej.

Aplikacja zapewnia, że ​​znak NUL nie jest używany w regułach gramatycznych lub
literały.

Deklaracje Sekcja
Sekcja deklaracji służy do definiowania symboli używanych do definiowania języka docelowego
i ich wzajemne relacje. W szczególności wiele dodatkowych informacji
wymagane do rozwiązania niejasności w gramatyce bezkontekstowej dla języka docelowego jest
podane tutaj.

Zazwyczaj Yacc przypisuje związek między generowanymi symbolicznymi nazwami a ich
podstawowa wartość liczbowa. Sekcja deklaracji umożliwia kontrolę
przypisanie tych wartości.

Możliwe jest również przechowywanie informacji semantycznych związanych z aktualnie włączonymi tokenami
stos parsowania w zdefiniowanym przez użytkownika języku C unia, jeśli członkowie związku są
związane z różnymi nazwami w gramatyce. Sekcja deklaracji przewiduje:
to również.

Pierwsza grupa deklaratorów poniżej przyjmuje listę nazw jako argumenty. Ta lista może
opcjonalnie może być poprzedzona nazwą członka związku C (zwaną a etykieta poniżej) pojawiające się
w ciągu '<' i '>'. (Jako wyjątek od konwencji typograficznych reszty tego
tom POSIX.1‐2008, w tym przypadkuetykieta> nie reprezentuje metazmiennej, ale
dosłowne znaki nawiasu ostrokątnego otaczające symbol). Użycie etykieta określa, że
tokeny wymienione w tym wierszu powinny być tego samego typu C, co członek związku, do którego odwołuje się
etykieta. Zostało to omówione bardziej szczegółowo poniżej.

W przypadku list służących do definiowania tokenów po pierwszym pojawieniu się danego tokena może nastąpić:
dodatnia liczba całkowita (jako ciąg cyfr dziesiętnych). Jeśli tak się stanie, wartość bazowa
przypisany do niego dla celów leksykalnych uważa się za ten numer.

Następujące deklaruje Nazwa być tokenem:

%znak [<etykieta>] Nazwa [numer] [Nazwa [numer]]...

If etykieta jest obecny, typ C dla wszystkich tokenów w tym wierszu powinien być zadeklarowany jako typ
do którego odwołuje się etykieta. Jeśli dodatnia liczba całkowita, numer, następuje Nazwa, wartość ta powinna być
przypisane do tokena.

Następujące deklaruje Nazwa być tokenem i przypisuje mu pierwszeństwo:

%lewo [<etykieta>] Nazwa [numer] [Nazwa [numer]]...
%prawidłowy [<etykieta>] Nazwa [numer] [Nazwa [numer]]...

W tej sekcji może pojawić się jedna lub więcej linii, z których każda zaczyna się od jednego z tych symboli.
Wszystkie żetony w tej samej linii mają ten sam poziom pierwszeństwa i asocjatywność; linie
są w kolejności rosnącego pierwszeństwa lub siły wiążącej. %lewo oznacza, że
operatory na tej linii są skojarzone i %prawidłowy podobnie oznacza rację
operatory asocjacyjne. Jeśli etykieta jest obecny, powinien zadeklarować typ C dla Nazwas jak opisano
dla %znak.

Następujące deklaruje Nazwa być tokenem i wskazuje, że nie można tego użyć
asocjacyjnie:

%nonassoc [<etykieta>] Nazwa [numer] [Nazwa [numer]]...

Jeśli parser napotka asocjacyjne użycie tego tokena, zgłasza błąd. Jeśli etykieta is
obecny, zadeklaruje typ C dla Nazwas jak opisano dla %znak.

Poniższy deklaruje, że członek związku Nazwas są nieterminalami, a zatem jest to wymagane
mieć etykieta pole na jego początku:

%rodzaj <etykieta> Nazwa...

Ponieważ zajmuje się tylko nieterminalami, przypisanie numeru tokena lub użycie literału jest
również zabronione. Jeśli ten konstrukt jest obecny, Yacc przeprowadza kontrolę typu; Jeśli to
konstrukcja nie jest obecna, stos parsowania powinien zawierać tylko int rodzaj.

Każde imię użyte w gramatyka nie zdefiniowany przez a %znak, %lewo, %prawidłowylub %nonassoc
zakłada się, że deklaracja reprezentuje symbol nieterminalny. ten Yacc narzędzie zgłosi
błąd dla dowolnego symbolu nieterminalnego, który nie pojawia się po lewej stronie co najmniej jednego
reguła gramatyczna.

Po określeniu typu, pierwszeństwa lub numeru tokena nazwy nie należy:
zmieniony. Jeżeli pierwsza deklaracja tokena nie nadaje numeru tokena, Yacc powinien
przypisz numer tokena. Po dokonaniu tego przypisania numer tokena nie zostanie zmieniony
przez wyraźne przypisanie.

Następujące deklaratory nie są zgodne z poprzednim wzorcem.

Poniższy deklaruje nieterminal Nazwa być początek symbol, który reprezentuje
największa, najbardziej ogólna struktura opisana przez reguły gramatyczne:

%początek Nazwa

Domyślnie jest to lewa strona pierwszej reguły gramatycznej; tą wartością domyślną może być
zastąpione tą deklaracją.

Poniższy deklaruje Yacc stos wartości będący połączeniem różnych typów wartości
pożądany.

%unia { ciało of unia (in C)}

Treść związku nie może zawierać niezrównoważonych tokenów wstępnego przetwarzania nawiasów klamrowych.

Domyślnie wartości zwracane przez akcje (patrz niżej) i analizator leksykalny powinny być:
typu int, Yacc Narzędzie śledzi typy i wstawia odpowiednie
nazwy członków unii w celu przeprowadzenia ścisłego sprawdzenia typu wynikowego parsera.

Alternatywnie, biorąc pod uwagę, że przynajmniej jedenetykieta> używany jest konstrukt, można zadeklarować unię
w pliku nagłówkowym (który należy umieścić w sekcji deklaracji za pomocą #zawierać
konstruować wewnątrz %{ i %}) i typedef używany do zdefiniowania symbolu YYSTYPE do reprezentowania
ten związek. Efekt %unia jest dostarczenie deklaracji YYSTYPE bezpośrednio od
die,en Yacc wkład.

Deklaracje i definicje w języku C mogą pojawić się w załączonej sekcji deklaracji
następującymi znakami:

%{ ... %}

Oświadczenia te zostaną skopiowane do pliku kodu i będą miały w nim zasięg globalny, więc
że mogą być używane w regułach i sekcjach programu. Oświadczenia nie zawierają:
"%}" poza komentarzem, literałem łańcuchowym lub stałą wieloznakową.

Aplikacja zapewnia zakończenie sekcji deklaracji przez token %%.

Gramatyka Zasady in Yacc
Sekcja reguł definiuje gramatykę bezkontekstową akceptowaną przez funkcję Yacc
generuje i kojarzy z tymi regułami działania w języku C i dodatkowe pierwszeństwo
Informacja. Gramatyka jest opisana poniżej i następuje formalna definicja.

Sekcja reguł składa się z co najmniej jednej reguły gramatycznej. Reguła gramatyczna ma postać:

A : Tułów ;

Symbol A reprezentuje nazwę nieterminalną i Tułów reprezentuje ciąg zero lub
jeszcze Nazwas, dosłownys, i semantyczny akcjas, po których może następować opcjonalny
precedens rządzićs. Tylko nazwy i literały biorą udział w tworzeniu
gramatyka; akcje semantyczne i reguły pierwszeństwa są używane w inny sposób. ten oraz
ten są Yacc interpunkcja. Jeśli istnieje kilka następujących po sobie reguł gramatycznych z
ta sama lewa strona, ('|') można użyć, aby uniknąć przepisywania
lewa strona; w tym przypadku pojawia się dopiero po ostatniej regule. Ciało
część może być pusta (lub pozbawiona nazw i literałów), aby wskazać, że nieterminal
symbol pasuje do pustego ciągu.

W ramach projektu Yacc Narzędzie przypisuje każdej regule unikalny numer. Reguły za pomocą pionowego paska
notacja to odrębne zasady. Numer przypisany do reguły pojawia się w opisie
plik.

Elementy składające się na KORPUS to:

Nazwa, dosłowny
Stanowią one zasady gramatyki: Nazwa jest albo żeton lub nieterminalny;
dosłowny oznacza siebie (bez wymaganych leksykalnie cudzysłowów).

semantyczny akcja
Z każdą regułą gramatyczną użytkownik może powiązać czynności, które należy wykonać za każdym razem
reguła jest rozpoznawana w procesie wprowadzania. (Zauważ, że słowo ``działanie'' może
odnoszą się również do działań parsera — przesuwania, zmniejszania itd.)

Te akcje mogą zwracać wartości i uzyskiwać wartości zwrócone przez poprzednie
działania. Te wartości sąprzechowywane w obiektach typu YYSTYPE (zobacz %unia).
wartość wyniku akcji należy trzymać na stosie parsowania lewą ręką
strony reguły, do których mają dostęp inne redukcje w ramach ich prawej ręki
bok. Używającetykieta> informacje podane w sekcji deklaracji,
kod wygenerowany przez Yacc może być ściśle sprawdzany pod względem typu i zawierać dowolne
Informacja. Ponadto analizator leksykalny może zapewnić te same rodzaje
wartości dla tokenów, w razie potrzeby.

Akcja jest arbitralną instrukcją C i jako taka może wykonywać dane wejściowe lub wyjściowe, call
podprogramy i zmieniać zmienne zewnętrzne. Akcja to jedno lub więcej instrukcji C
zamknięty w nawiasach klamrowych '{' i '}'. Oświadczenia nie zawierają:
tokeny przetwarzania wstępnego niezrównoważonych nawiasów klamrowych.

W akcji można wykorzystać pewne pseudozmienne. To są makra dostępu
do struktur danych znanych wewnętrznie do Yacc.

$$ Wartość akcji można ustawić przypisując ją do $$. Jeśli typ
sprawdzanie jest włączone, a typ wartości do przypisania nie może być
ustalone, może zostać wygenerowany komunikat diagnostyczny.

$numer Odnosi się to do wartości zwracanej przez składnik określony przez
żeton numer po prawej stronie reguły, czytanie od lewej do prawej;
numer może być zerowa lub ujemna. Jeśli numer wynosi zero lub jest ujemna, to
odnosi się do danych powiązanych z nazwą na stosie parsera
poprzedzający skrajny lewy symbol bieżącej reguły. (To jest, „0 USD”
odnosi się do imienia bezpośrednio poprzedzającego lewą skrajną nazwę w
aktualna reguła znajduje się na stosie parsera i „$-1” odnosi się do
symbol do jego lewo.) Jeśli numer odnosi się do elementu poza prądem
punkt w regule lub poza dnem stosu, wynikiem jest
nieokreślony. Jeśli sprawdzanie typu jest włączone, a typ wartości, która ma być
nie można określić przypisanego, może zostać wygenerowany komunikat diagnostyczny.

$<etykieta>numer
Odpowiadają one dokładnie odpowiednim symbolom bez etykieta
włączenie, ale pozwala na ścisłe sprawdzanie typu (i wyklucza niechciane)
konwersje typu). Efekt jest taki, że makro jest rozszerzane do użycia etykieta
aby wybrać element z unii YYSTYPE (za pomocą nazwa_danych.znacznik).
Jest to szczególnie przydatne, jeśli numer nie jest pozytywny.

$<etykieta>$ To nakłada na referencję typ członka związku, do którego się odnosimy
by etykieta. Ta konstrukcja ma zastosowanie, gdy odniesienie do lewej
wartość kontekstu występuje w gramatyce i zapewnia Yacc ze środkami
do wyboru typu.

Akcje mogą wystąpić w dowolnym miejscu reguły (nie tylko na końcu); akcja może uzyskać dostęp
wartości zwracane przez akcje po jego lewej stronie, a z kolei wartością, którą zwraca, może być
dostępne za pomocą działań po jego prawej stronie. Akcja pojawiająca się w środku reguły
jest równoznaczne z zastąpieniem działania nowym symbolem nieterminalnym oraz
dodanie pustej reguły z tym nieterminalnym symbolem po lewej stronie. ten
działanie semantyczne związane z nową regułą jest równoważne z oryginałem
akcja. Użycie akcji w ramach reguł może wprowadzać konflikty, które nie
inaczej istnieją.

Domyślnie wartością reguły jest wartość pierwszego w niej elementu.
Jeśli pierwszy element nie ma typu (szczególnie w przypadku a
literał) i sprawdzanie typu jest włączone przez %rodzaj, pojawi się komunikat o błędzie.

precedens
Słowo kluczowe %prec może służyć do zmiany poziomu pierwszeństwa związanego z a
szczególna reguła gramatyczna. Przykładami tego są przypadki, w których jednoargumentowy i binarny
operator mają tę samą reprezentację symboliczną, ale muszą być podane inaczej
pierwszeństwa, lub gdy obsługa niejednoznacznej konstrukcji if-else jest
niezbędny. Zastrzeżony symbol %prec może pojawić się natychmiast po ciele
reguły gramatycznej i może po nim następować nazwa tokena lub literał. Powinno
spowodować, że pierwszeństwo reguły gramatycznej stanie się pierwszeństwem następującego tokena
nazwa lub literał. Akcja dla reguły jako całości może nastąpić %prec.

Jeżeli następuje sekcja programu, aplikacja zapewnia, że ​​reguły gramatyczne są:
zakończony przez %%.

programy Sekcja
W ramach projektu programów sekcja może zawierać definicję analizatora leksykalnego yylex(), i jakikolwiek
inne funkcje; na przykład te używane w akcjach określonych w regułach gramatycznych. To
nie jest określone, czy sekcja programów poprzedza czy następuje po czynnościach semantycznych w
plik wyjściowy; w związku z tym, jeśli aplikacja zawiera jakiekolwiek definicje makr i
deklaracje, które mają odnosić się do kodu w czynnościach semantycznych, umieszcza je;
w ciągu "%{ ... %}" w sekcji deklaracji.

Wkład Gramatyka
Następujące dane wejściowe do Yacc zwraca parser dla danych wejściowych do Yacc. Ta formalna składnia
ma pierwszeństwo przed poprzednim opisem składni tekstu.

Struktura leksykalna jest zdefiniowana mniej precyzyjnie; Leksykalny Structure of die,en Gramatyka definiuje
większość terminów. Korespondencja między poprzednimi terminami a poniższymi tokenami jest jak
Następuje.

IDENTYFIKATOR Odpowiada to koncepcji Nazwa, podane wcześniej. Obejmuje również
literały zdefiniowane wcześniej.

C_IDENTYFIKATOR
To jest nazwa, a dodatkowo wiadomo, że następuje po niej a . A
literał nie może dostarczyć tego tokena.

LICZBA Ciąg cyfr (nieujemna liczba dziesiętna).

TYP, LEWA, ZNAK, LCURL, RCURL
Odpowiadają one bezpośrednio %rodzaj, %lewo, %%, %{, %}.

{ ... } Oznacza to kod źródłowy w języku C, z możliwym włączeniem „$”
makra, jak omówiono wcześniej.

/* Gramatyka dla die,en wkład do yak. */
/* Podstawowy wpisy. */
/* W ramach projektu następujący uznane by die,en leksykalny analizator. */

%token IDENTIFIER /* Zawiera identyfikatory i literały */
%token C_IDENTIFIER /* identyfikator (ale nie dosłowny)
po którym następuje:. */
%token NUMBER /* [0-9][0-9]* */

/* Zarezerwowane słowa : %type=>TYPE %left=>LEFT i tak dalej */

%token LEWO PRAWO NONASSOC TOKEN PREC TYPE START UNION

%token MARK /* Znak %%. */
%token LCURL /* Znak %{. */
%token RCURL /* Znak %}. */

/* 8-bitowe literały znakowe oznaczają same siebie; */
/* tokeny muszą być zdefiniowane dla znaków wielobajtowych. */

%rozpocznij specyfikację

%%

spec : defs MARK rządzi ogonem
;
ogon : MARK
{
/* W tej akcji skonfiguruj resztę pliku. */
}
| /* Pusty; drugi ZNAK jest opcjonalny. */
;
defs : /* Puste. */
| defs def
;
def : START IDENTYFIKATOR
| UNIA
{
/* Kopiowanie definicji unii na wyjście. */
}
| LCURL
{
/* Skopiuj kod C do pliku wyjściowego. */
}
RCURL
| słowo tag nlist
;
słowo : TOKEN
| LEWO
| PRAWIDŁOWY
| NONASSOC
| RODZAJ
;
tag : /* Pusty: identyfikator tagu unii opcjonalny. */
| '<' IDENTYFIKATOR '>'
;
nlist : nmno
| nlista nmno
;
nmno : IDENTIFIER /* Uwaga: literał niepoprawny z typem %. */
| NUMER IDENTYFIKATORA /* Uwaga: niepoprawny z typem %. */
;

/* Sekcja reguł */

reguły : C_IDENTIFIER rbody prec
| zasady rządzą
;
reguła : C_IDENTIFIER rbody prec
| '|' rbody prec
;
rbody : /* pusty */
| IDENTYFIKATOR ciała
| Akt ciała
;
działać : '{'
{
/* Skopiuj akcję, przetłumacz $$ i tak dalej. */
}
'}'
;
prec : /* Pusty */
| IDENTYFIKATOR PREC
| Ustawa o IDENTYFIKATORze PREC
| prec ';'
;

Konflikty
Parser utworzony dla gramatyki wejściowej może zawierać stany, w których występują konflikty. ten
konflikty występują, ponieważ gramatyka nie jest LALR(1). Gramatyka niejednoznaczna zawsze zawiera
przynajmniej jeden LALR(1) konflikt. ten Yacc Narzędzie rozwiąże wszystkie konflikty, używając albo
reguły domyślne lub reguły pierwszeństwa określone przez użytkownika.

Konflikty to albo przesuń/zredukuj konflikty, albo zredukuj/zredukuj konflikty. Zmiana/zmniejszenie
konflikt to sytuacja, w której dla danego stanu i symbolu wyprzedzenia występuje zarówno akcja przesunięcia, jak i a
zmniejszyć działania są możliwe. Konflikt redukuj/zmniejszaj jest tam, gdzie dla danego stanu i
symbol lookahead, możliwe są redukcje według dwóch różnych zasad.

Poniższe reguły opisują, jak określić, jakie działania należy podjąć w przypadku wystąpienia konfliktu. Nie
wszystkie konflikty zmiany/redukcji mogą być pomyślnie rozwiązane w ten sposób, ponieważ konflikt może:
być spowodowane czymś innym niż dwuznaczność, więc nieostrożne korzystanie z tych udogodnień może spowodować
język akceptowany przez parser jako znacznie różny od tego, który był zamierzony. ten
plik opisu powinien zawierać wystarczające informacje, aby zrozumieć przyczynę
konflikt. Tam, gdzie powodem jest niejednoznaczność, należy zastosować domyślne lub wyraźne zasady
wystarczający do wytworzenia działającego parsera.

Deklarowane precedensy i asocjacje (zob Deklaracje Sekcja) są używane do
rozwiąż konflikty analizowania w następujący sposób:

1. Pierwszeństwo i asocjatywność są związane z każdą regułą gramatyczną; to jest
pierwszeństwo i asocjatywność ostatniego znaku lub dosłowu w treści reguły. Jeśli
die,en %prec używane jest słowo kluczowe, zastępuje ono to domyślne. Niektóre reguły gramatyczne mogą nie być
mają zarówno pierwszeństwo, jak i asocjatywność.

2. Jeśli występuje konflikt przesunięcia/zmniejszenia, a zarówno reguła gramatyczna, jak i symbol wejściowy
mają pierwszeństwo i łączność z nimi, wtedy konflikt zostaje rozwiązany
na korzyść akcji (przesunięcie lub zmniejszenie) związanej z wyższym priorytetem. Jeśli
pierwszeństwa są takie same, stosuje się asocjatywność; implikacje skojarzone z lewej strony
redukować, prawo skojarzone implikuje przesunięcie, a nieskojarzone oznacza błąd w
analizowany ciąg.

3. Kiedy występuje konflikt zmiany/redukcji, który nie może być rozwiązany zgodnie z zasadą 2, zmiana jest
Gotowe. Konflikty rozwiązane w ten sposób są zliczane na wyjściu diagnostycznym opisanym w
Błąd Prowadzenie.

4. W przypadku konfliktu redukuj/redukuj, redukcji dokonuje się zgodnie z regułą gramatyczną, która:
występuje wcześniej w sekwencji wejściowej. Konflikty rozwiązane w ten sposób są liczone w
wyjście diagnostyczne opisane w Błąd Prowadzenie.

Konflikty rozwiązywane przez pierwszeństwo lub asocjację nie będą liczone w zmianie/redukcji
i zmniejszyć/zmniejszyć konflikty zgłaszane przez Yacc w przypadku błędu standardowego lub w
plik opisu.

Błąd Prowadzenie
Token błąd są zarezerwowane do obsługi błędów. Imię błąd może być stosowany w
zasady gramatyki. Wskazuje miejsca, w których parser może naprawić błąd składni. ten
domyślna wartość błąd wynosi 256. Jego wartość można zmienić za pomocą %znak deklaracja.
Analizator leksykalny nie powinien zwracać wartości błąd.

Parser powinien wykryć błąd składni, gdy znajduje się w stanie, w którym skojarzona czynność
z symbolem patrzenia w przyszłość to błąd. Akcja semantyczna może spowodować zainicjowanie parsera
obsługa błędów poprzez wykonanie makra YYERROR. Gdy wykonywane jest YYERROR, semantyczne
akcja przekazuje kontrolę z powrotem do parsera. YYERROR nie może być używany poza semantyką
działania.

Gdy parser wykryje błąd składni, zwykle wywołuje yybłąd() ze znakiem
ciąg "składnia błąd" jako jego argument. Wywołanie nie zostanie wykonane, jeśli parser jest nieruchomy
przywracanie poprzedniego błędu po wykryciu błędu. Uważa się, że parser
naprawianie się po poprzednim błędzie, dopóki parser nie przesunie się o co najmniej trzy
normalne symbole wejściowe od czasu wykrycia ostatniego błędu lub wykonania czynności semantycznej
makro yyerrok. Parser nie będzie dzwonił yybłąd() po wykonaniu YYERROR.

Funkcja makro YYRECOVERING zwraca 1, jeśli wykryto błąd składni, a
parser nie został jeszcze w pełni z niego odzyskany. W przeciwnym razie zostanie zwrócone zero.

Gdy parser wykryje błąd składni, parser sprawdzi, czy poprzednia składnia
wykryto błąd. Jeśli wykryto poprzedni błąd i nie ma normalnych symboli wejściowych
zostały przesunięte od czasu wykrycia poprzedniego błędu, parser sprawdza, czy
symbol patrzenia w przód jest znacznikiem końcowym (patrz Interfejs do die,en Leksykalny Analizator). Jeśli tak,
parser zwróci wartość niezerową. W przeciwnym razie symbolem uprzedzenia powinien być:
odrzucone, a normalne analizowanie zostanie wznowione.

Kiedy YYERROR jest wykonywany lub gdy parser wykryje błąd składniowy i nie ma poprzedniego błędu
został wykryty lub co najmniej jeden normalny symbol wejściowy został przesunięty od poprzedniego
wykryto błąd, parser powinien cofać się o jeden stan na raz, dopóki stos parsowania nie zostanie
pusty lub obecny stan pozwala na przełączenie błąd. Jeśli parser opróżni parsowanie
stos, zwróci wartość niezerową. W przeciwnym razie to się przesunie błąd i
następnie wznów normalne analizowanie. Jeśli parser odczyta symbol wyprzedzenia przed wystąpieniem błędu
wykryte, ten symbol powinien nadal być symbolem antycypowanym, gdy analizowanie zostanie wznowione.

Makro yyerrok w czynności semantycznej powoduje, że parser zachowuje się tak, jakby w pełni
odzyskane z wszelkich poprzednich błędów. Makro yyclearin spowoduje odrzucenie parsera
aktualny token z wyprzedzeniem. Jeśli aktualny token lookahead nie został jeszcze odczytany,
yyclearin nie ma żadnego skutku.

Makro YYACCEPT spowoduje, że parser zwróci wartość zero. Makro YYABORT
spowoduje, że parser zwróci wartość niezerową.

Interfejs do die,en Leksykalny Analizator
W ramach projektu yylex() funkcja jest funkcją o wartościach całkowitych, która zwraca a żeton numer
reprezentujący rodzaj odczytanego tokena. Jeśli istnieje wartość powiązana z tokenem
zwrócone przez yylex() (patrz omówienie etykieta powyżej), jest on przypisany do
zmienna zewnętrzna Yylval.

Jeśli parser i yylex() nie zgadzam się na te numery tokenów, niezawodna komunikacja
między nimi nie może wystąpić. W przypadku literałów (znaków jednobajtowych) tokenem jest po prostu
wartość liczbowa znaku w bieżącym zestawie znaków. Liczby dla pozostałych żetonów
może być wybrany przez Yacclub wybrany przez użytkownika. W obu przypadkach #definiować skonstruować
z języka C jest używany, aby zezwolić yylex(), aby symbolicznie zwrócić te liczby. ten #definiować oświadczenia
są umieszczane w pliku kodu i pliku nagłówkowym, jeśli ten plik jest wymagany. Zestaw
znaki dozwolone przez Yacc w identyfikatorze jest większy niż dozwolony przez C. Token
Nazwy zawierające takie znaki nie będą uwzględniane w #definiować deklaracje.

Jeśli numery żetonów są wybierane przez Yacc, należy przypisać tokeny inne niż literały
liczby większe niż 256, chociaż nie jest dorozumiana kolejność. Token można jawnie przypisać
liczbę, po jej pierwszym pojawieniu się w sekcji deklaracji z liczbą.
Nazwy i literały niezdefiniowane w ten sposób zachowują swoją domyślną definicję. Wszystkie numery tokenów
przypisane przez Yacc są niepowtarzalne i różnią się od numerów tokenów używanych do liter i
tokeny przypisane przez użytkownika. Jeśli zduplikowane numery tokenów powodują konflikty w generowaniu parsera,
Yacc zgłasza błąd; w przeciwnym razie nie jest określone, czy przypisanie tokena jest
akceptowane lub zgłaszany jest błąd.

Koniec wejścia oznaczony jest specjalnym tokenem zwanym znacznik końcowy, który posiada token
liczba zerowa lub ujemna. (Te wartości są nieprawidłowe dla każdego innego tokena.) Wszystkie
analizatory leksykalne zwracają zero lub ujemną liczbę jako liczbę symboliczną po osiągnięciu końca
ich wkład. Jeśli tokeny do, ale z wyłączeniem znacznika końcowego, tworzą strukturę, która
pasuje do symbolu startu, parser zaakceptuje dane wejściowe. Jeśli znacznik końcowy jest widoczny w
w każdym innym kontekście będzie to uważane za błąd.

Kończenie die,en Program
Oprócz yyparse() i yylex(), funkcje yybłąd() i główny() są potrzebne do
stworzyć kompletny program. Aplikacja może dostarczyć główny() i yybłąd() lub te
procedury można uzyskać z Yacc biblioteka.

Yacc Biblioteka
Następujące funkcje pojawiają się tylko w Yacc biblioteka dostępna przez −l y
operand do c99; mogą zatem zostać przedefiniowane przez zgodny wniosek:

int główny(unieważnić)
Ta funkcja powinna wywołać yyparse() i wyjdź z nieokreśloną wartością. Inne akcje
w ramach tej funkcji są nieokreślone.

int yybłąd(const zwęglać *s)
Ta funkcja zapisuje argument zakończony znakiem NUL do standardowego błędu, po którym następuje:
a .

Kolejność −l y i −l l operandy podane do c99 jest znacząca; wniosek powinien:
albo zapewnij własne główny() funkcjonować lub zapewnić, że −l y poprzedza −l l.

Debugowanie die,en Parser
Parser wygenerowany przez Yacc będzie mieć w sobie zaplecze diagnostyczne, które może być opcjonalnie
włączone w czasie kompilacji lub w czasie wykonywania (jeśli włączone w czasie kompilacji). ten
Kompilacja kodu debugowania runtime jest pod kontrolą preprocesora YYDEBUG
symbol. Jeśli YYDEBUG ma wartość niezerową, należy uwzględnić kod debugowania. Jeżeli to jest
wartość wynosi zero, kod nie będzie uwzględniany.

W parserach, w których uwzględniono kod debugowania, zewnętrzny int yydebug może być
służy do włączania debugowania (z wartością niezerową) i wyłączania (wartość zerowa) w czasie wykonywania. ten
wartość początkowa yydebug powinna wynosić zero.

Gdy −t jest określony, plik kodu powinien być zbudowany w taki sposób, że jeśli YYDEBUG jeszcze nie istnieje
zdefiniowany w czasie kompilacji (za pomocą c99 −D Na przykład opcja YYDEBUG), YYDEBUG powinien
być wyraźnie ustawione na 1. Kiedy −t nie jest określony, plik kodu powinien być zbudowany w taki sposób, aby:
jeśli YYDEBUG nie jest jeszcze zdefiniowany, należy go jawnie ustawić na zero.

Format danych wyjściowych debugowania jest nieokreślony, ale zawiera przynajmniej wystarczającą ilość informacji
w celu określenia przesunięcia i redukcji działań oraz symboli wejściowych. Zapewnia również
informacje o usuwaniu błędów.

Algorytmy
Parser skonstruowany przez Yacc wdraża i LALR(1) algorytm parsowania udokumentowany w
literatura. Nie jest określone, czy parser jest sterowany tabelą, czy kodowany bezpośrednio.

Parser wygenerowany przez Yacc nigdy nie będzie żądać symbolu wejściowego od yylex() podczas gdy w a
stan, w którym jedynymi akcjami innymi niż akcja błędu są redukcje o pojedynczą regułę.

Te pojęcia definiuje literatura teorii parsowania.

Limity
W ramach projektu Yacc narzędzie może mieć kilka wewnętrznych tabel. Minimalne wartości maksymalne dla tych tabel
przedstawiono w poniższej tabeli. Dokładne znaczenie tych wartości to implementacja-
zdefiniowane. Wdrożenie określi relację między tymi wartościami a między
oraz wszelkie komunikaty o błędach, które implementacja może wygenerować w przypadku ich wyczerpania
miejsce na dowolną strukturę wewnętrzną. Wdrożenie może łączyć grupy tych zasobów
do jednej puli, o ile suma dostępna dla użytkownika nie spada poniżej sumy
rozmiarów określonych w tej sekcji.

Tabela: Wewnętrzne Limity in Yacc

┌┌─────────┬┬┬───────┬┬┬───────────────────────── ────┐┐.
│ │. Minimum │ │.
LimitMaksymalnyOpis
├├─────────┼┼┼───────┼┼┼───────────────────────── ────┤┤.
│{NTERMS} │ 126 │ Liczba tokenów. │.
│{NNONTERM} │ 200 │ Liczba nieterminali. │.
│{NPROD} │ 300 │ Liczba reguł. │.
│{NSTATES} │ 600 │ Liczba stanów. │.
│{MEMSIZE} │ 5200 │ Długość reguł. Całkowity │
│ │ │ długość, w nazwach (tokeny i │
│ │ │ nieterminale), wszystkich │
│ │ │ zasady gramatyki. The │.
│ │ │ lewa strona jest liczona dla │
│ │ │ każda reguła, nawet jeśli nie jest │
│ │ │ wyraźnie powtórzone, jako │
│ │ │ określone w Gramatyka Zasady in
│ │ Yacc. │.
│{ACTSIZE} │ 4000 │ Liczba akcji. „Działania” │
│ │ │ tutaj (i w opisie │
│ │ │ plik) odnoszą się do działań parsera │
│ │ │ (przesuń, zmniejsz itd.) nie │
│ │ │ do akcji semantycznych zdefiniowanych w │
│ │ Gramatyka Zasady in Yacc. │.
└└─────────┴┴┴───────┴┴┴───────────────────────── ────┘┘.

EXIT STATUS


Zwracane są następujące wartości wyjściowe:

0 Pomyślne zakończenie.

>0 Wystąpił błąd.

KONSEKWENCJE OF BŁĘDY


W przypadku napotkania jakichkolwiek błędów uruchamianie jest przerywane i Yacc kończy pracę z niezerowym statusem.
Mogą być tworzone pliki z kodem częściowym i pliki nagłówkowe. Podsumowanie informacji w
plik opisu powinien być zawsze tworzony, jeśli −v flaga jest obecna.

W ramach projektu następujący działy informacyjny.

WNIOSEK ZASTOSOWANIE


Historyczne implementacje mają konflikty nazw na nazwach yacc.tmp, yacc.acts,
yacc.debug, y.tab.c, y.tab.h, y.wyjście jeśli więcej niż jeden egzemplarz Yacc biegnie w a
jeden katalog na raz. ten −b dodano opcję, aby rozwiązać ten problem. ten
powiązany problem zezwalania na wielokrotne Yacc parsery do umieszczenia w tym samym pliku były
zaadresowany przez dodanie −p możliwość zastąpienia wcześniej zakodowanego na sztywno yy zmienny prefiks.

Opis −p opcja określa minimalny zestaw nazw funkcji i zmiennych
które powodują konflikt, gdy wiele parserów jest połączonych ze sobą. YYSTYPE nie musi być
zmieniony. Zamiast tego programista może użyć −b dać pliki nagłówkowe dla różnych parserów
różne nazwy, a następnie plik z yylex() dla danego parsera może zawierać
nagłówek dla tego parsera. Nazwy takie jak yyclearrr nie trzeba ich zmieniać, ponieważ
są używane tylko w akcjach; nie mają połączenia. Możliwe, że
implementacja ma inne nazwy, albo wewnętrzne dla implementacji rzeczy takich jak
yyclearrrlub dostarczanie niestandardowych funkcji, za pomocą których chce się zmienić −p.

Operatory jednoargumentowe, które są tym samym tokenem, co operator binarny, ogólnie potrzebują ich
dostosowany priorytet. Jest to obsługiwane przez %prec symbol doradczy związany z
konkretna reguła gramatyczna definiująca ten jednoargumentowy operator. (Widzieć Gramatyka Zasady in Yacc.)
Aplikacje nie muszą używać tego operatora dla operatorów jednoargumentowych, ale gramatyki
które tego nie wymagają są rzadkie.

PRZYKŁADY


Dostęp do Yacc biblioteka jest uzyskiwana za pomocą operandów przeszukiwania biblioteki, aby c99. Aby użyć
Yacc biblioteka główny():

c99 y.tab.c −l y

Oboje lex biblioteka i Yacc biblioteka zawiera główny(). Aby uzyskać dostęp do Yacc główny():

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

Gwarantuje to, że Yacc biblioteka jest przeszukiwana jako pierwsza, aby jej główny() jest używany.

Historyczne Yacc biblioteki zawierały dwie proste funkcje, które normalnie są kodowane
przez programistę aplikacji. Te funkcje są podobne do następującego kodu:

#zawierać
int główny (unieważniony)
{
zewnętrzny int yyparse();

setlocale(LC_ALL, "");

/* Jeśli następujący parser jest tworzony przez leksa,
aplikacja musi uważać, aby upewnić się, że LC_CTYPE
i LC_COLLATE są ustawione na ustawienia regionalne POSIX. */
(nieważny) yyparse();
powrót (0);
}

#włączać

int yyerror(const char *msg)
{
(nieważne) fprintf(stderr, "%s\n", msg);
powrót (0);
}

RACJONALNE UZASADNIENIE


Referencje w Referencje dokumenty może być pomocny w konstruowaniu parsera
generator. Wspomniany artykuł DeRemer i Pennello (wraz z pracami, które
referencje) opisuje technikę generowania parserów, które są zgodne z tą objętością
POSIX.1‐2008. Prace w tym obszarze nadal trwają, dlatego wdrażający powinni skonsultować się
aktualna literatura przed wykonaniem jakichkolwiek nowych implementacji. Oryginalny artykuł Knutha to
teoretyczne podstawy dla tego rodzaju parsera, ale generowane przez niego tabele są niepraktyczne
duże dla rozsądnych gramatyk i nie powinny być używane. Sformułowanie „odpowiednikiem” brzmi
celowe, aby zapewnić, że najlepsze stoły, które są LALR(1) można wygenerować.

Nastąpiło zamieszanie między klasą gramatyk, algorytmami potrzebnymi do generowania
parsery i algorytmy potrzebne do analizowania języków. Wszyscy są rozsądni
prostokątny. W szczególności generator parserów, który akceptuje pełen zakres LR(1)
gramatyki nie muszą generować tabeli bardziej złożonej niż ta, która akceptuje SLR(1) (a
stosunkowo słaba klasa gramatyk LR) dla gramatyki, która jest SLR(1). Taki
realizacja również nie musi uwzględniać przypadku; kompresja tabeli może dać SLR(1)
tabeli (lub jeszcze mniejszej) bez rozpoznania, że ​​gramatyka jest SLR(1). The
prędkość LR(1) parser dla dowolnej klasy jest bardziej zależny od reprezentacji tabeli i
kompresja (lub generacja kodu, jeśli generowany jest bezpośredni parser) niż na klasie
gramatyki obsługiwanej przez generator tabel.

Szybkość generatora parsera jest w pewnym stopniu zależna od klasy gramatyki it
uchwyty. Jednak oryginalne algorytmy artykułów Knutha do konstruowania parserów LR były:
oceniany przez jego autora jako niepraktycznie powolny w tamtym czasie. Chociaż pełny LR to więcej
złożone niż LALR(1) wraz z poprawą szybkości komputera i algorytmów różnica (pod względem
akceptowalnego czasu realizacji zegarów ściennych) staje się mniej znaczący.

Potencjalni autorzy są ostrzegani, że przywoływany artykuł DeRemer i Pennello
poprzednio cytowane identyfikuje błąd (nadmierne uproszczenie obliczania LALR(1)
zestawy lookahead) w niektórych LALR(1) zdania algorytmu, które poprzedziły go do
opublikowanie. Powinni poświęcić czas na odszukanie tego artykułu, a także aktualnych istotnych
pracy, zwłaszcza Aho.

W ramach projektu −b dodano opcję, aby zapewnić przenośną metodę zezwalania Yacc pracować nad
wiele oddzielnych parserów w tym samym katalogu. Jeśli katalog zawiera więcej niż jeden
Yacc gramatyki, a obie gramatyki są konstruowane w tym samym czasie (np. przez a
równolegle robić programu), skutki konfliktu. Chociaż rozwiązaniem nie jest praktyka historyczna,
koryguje znany brak w historycznych implementacjach. Odpowiednie zmiany były
do wszystkich sekcji, które odwołują się do nazw plików y.tab.c (teraz ``plik z kodem''),
y.tab.h (teraz ``plik nagłówkowy'') i y.wyjście (teraz ``plik opisu'').

Gramatyka dla Yacc dane wejściowe są oparte na dokumentacji System V. Opis tekstowy
pokazuje tam, że ';' jest wymagane na końcu reguły. Gramatyka i
wdrożenie tego nie wymaga. (Sposób użycia C_IDENTYFIKATOR powoduje wystąpienie redukcji w
dobre miejsce.)

Również w tej implementacji konstrukcje takie jak %znak może być zakończony przez a
, ale gramatyka nie pozwala na to. Słowa kluczowe, takie jak %znak mogą
pojawiają się również wielkimi literami, co znowu nie jest omawiane. W większości miejsc, gdzie '%' jest używany,
można zastąpić, a niektóre symbole mają alternatywną pisownię
(na przykład, %LEWO może być "%<" lub nawet "\<").

Historycznieetykieta> może zawierać dowolne znaki z wyjątkiem '>', w tym spacje, w
realizacja. Jednak od czasu etykieta musi odnosić się do członka związku zgodnego z normą ISO C, w
implementacje zgodne z praktyką muszą obsługiwać tylko zestaw znaków dla ISO C
standardowe identyfikatory w tym kontekście.

Wiadomo, że niektóre historyczne implementacje akceptują akcje zakończone przez
Kropka. Historyczne implementacje często pozwalają „$” w imionach. Zgodna implementacja
nie musi wspierać żadnego z tych zachowań.

Decydowanie, kiedy użyć %prec ilustruje trudność w określeniu zachowania Yacc.
Mogą wystąpić sytuacje, w których gramatyka nie jest, ściśle mówiąc, w błędzie, a jednak
Yacc nie potrafi tego jednoznacznie zinterpretować. Rozwiązywanie niejednoznaczności w gramatyce może
w wielu przypadkach można rozwiązać poprzez podanie dodatkowych informacji, takich jak używanie %rodzaj or
%unia deklaracje. Często jest to łatwiejsze i zwykle daje mniejszy parser do wzięcia
tę alternatywę, gdy jest to właściwe.

Rozmiar i czas wykonania programu wyprodukowanego bez kodu debugującego w czasie wykonywania to
zwykle mniejsze i nieco szybsze w historycznych wdrożeniach.

Komunikaty statystyczne z kilku historycznych implementacji obejmują następujące typy
informacje:

n/512 zacisków, n/300 nieterminali
n/600 reguł gramatycznych, n/1500 stanów
n zmiana/redukcja, n zmniejszyć/zmniejszyć zgłaszane konflikty
n/Wykorzystano 350 zestawów roboczych
Pamięć: stany itp. n/15000, parser n/ 15000
n/600 odrębnych zestawów lookahead
n dodatkowe zamknięcia
n wpisy zmianowe, n wyjątki
n przejdź do wpisów
n wpisy zapisane przez goto default
Wykorzystana przestrzeń optymalizatora: wejście n/15000, wyjście n/ 15000
n wpisy w tabeli, n zero
Maksymalny spread: n, Maksymalne przesunięcie: n

Raport tabel wewnętrznych w pliku opisu jest pozostawiony zgodnie z implementacją
ponieważ wszystkie aspekty tych ograniczeń są również zdefiniowane w ramach implementacji. Niektóre realizacje
mogą korzystać z technik dynamicznej alokacji i nie muszą zgłaszać konkretnych wartości granicznych.

Format y.wyjście plik nie został podany, ponieważ nie podano specyfikacji formatu
widziane w celu zwiększenia przenośności aplikacji. Aukcja ma na celu przede wszystkim pomóc człowiekowi
użytkownicy rozumieją i debugują parser; zastosowanie y.wyjście przez zgodny skrypt aplikacji
byłoby niezwykłe. Ponadto wdrożenia nie przyniosły spójnych wyników i nie
popularny format był oczywisty. Format wybrany przez wdrożenie powinien być ludzki-
czytelny, oprócz wymogu, aby był to plik tekstowy.

Standardowe raporty o błędach nie są szczegółowo opisane, ponieważ są rzadko używane do
zgodnych aplikacji i nie było powodu, aby ograniczać implementacje.

Niektóre implementacje rozpoznają „={” jako odpowiednik '{' ponieważ pojawia się w historycznym
dokumentacja. Ta konstrukcja została uznana i udokumentowana jako przestarzała już dawno
1978, we wzmiankowanym Yacc: Jeszcze Inne Kompilator-Kompilator. Ten tom POSIX.1‐2008
postanowił pozostawić go jako przestarzały i pominąć.

Znaki wielobajtowe powinny być rozpoznawane przez analizator leksykalny i zwracane jako tokeny.
Nie powinny być zwracane jako wielobajtowe literały znakowe. Token błąd który jest używany
do naprawy błędów zwykle przypisywana jest wartość 256 w historycznej implementacji.
Zatem wartość tokena 256, która jest używana w wielu wielobajtowych zestawach znaków, nie jest
dostępne do użycia jako wartość tokena zdefiniowanego przez użytkownika.

PRZYSZŁOŚĆ KIERUNKI


Brak.

Korzystaj z yaccposix online za pomocą usług onworks.net


Ad


Ad