Angielskifrancuskihiszpański

Ad


Ulubiona usługa OnWorks

yaccposix — Online w chmurze

Uruchom yaccposix w bezpłatnym dostawcy hostingu OnWorks w systemie Ubuntu Online, Fedora Online, emulatorze online systemu Windows lub emulatorze online systemu MAC OS

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

PROGRAM:

IMIĘ


yacc — kolejny kompilator kompilatora (ROZWÓJ)

STRESZCZENIE


Yacc [−dltv] [−b przedrostek_pliku] [−str sym_prefix] gramatyka

OPIS


Połączenia Yacc Narzędzie odczyta opis gramatyki bezkontekstowej w gramatyka i napisz C
kod źródłowy zgodny ze standardem ISO C do pliku z kodem i opcjonalnie nagłówka
informacje do pliku nagłówkowego w bieżącym katalogu. Wygenerowany kod źródłowy powinien
nie zależą od żadnego niezdefiniowanego, nieokreślonego lub zdefiniowanego w implementacji zachowania, z wyjątkiem
przypadkach, gdy jest ono skopiowane bezpośrednio z dostarczonej gramatyki, lub w przypadkach, w których tak jest
udokumentowane realizacją. Kod C powinien definiować funkcję i powiązane procedury
oraz makra dla automatu wykonującego algorytm analizujący spełniający wymagania w
Algorytmy.

Formę i znaczenie gramatyki opisano w części OPIS ROZSZERZONY.

Kod źródłowy C i plik nagłówkowy należy utworzyć w formie odpowiedniej jako dane wejściowe dla języka C
kompilator (patrz c99).

OPCJE


Połączenia 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 przedrostek_pliku
Zastosowanie przedrostek_pliku zamiast y jako przedrostek dla wszystkich nazw plików wyjściowych. Kod
filet y.tab.c, plik nagłówkowy y.tab.h (utworzono, kiedy -d jest określony) oraz
plik opisu y.wyjście (utworzono, kiedy -w jest określony) zostaje zmieniony na
przedrostek_pliku.zakładka.c, przedrostek_pliku.tab.h, przedrostek_pliku.wyjście, Odpowiednio.

-d Zapisz plik nagłówkowy; domyślnie zapisywany jest tylko plik kodu. The #definiować
instrukcje kojarzą kody tokenów przypisane przez Yacc z deklaracją użytkownika
nazwy tokenów. Dzięki temu 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 żadnego #linia konstrukty. Jeśli ta opcja
nie istnieje, nie jest określone, czy zawiera plik kodu, czy plik nagłówkowy
#linia dyrektywy. Tego słowa należy używać wyłącznie po gramatyce i powiązanym z nią słowie
działania są w pełni debugowane.

−str sym_prefix
Zastosowanie sym_prefix zamiast yy jako przedrostek dla wszystkich nazw zewnętrznych produkowanych przez
Yacc. Nazwy, których to dotyczy, obejmują funkcje parse() yylex(), oraz
yy błąd() i zmienne Yylval, Yychar, yydebug. (W pozostałej części
w tej sekcji do sześciu cytowanych symboli odniesiono się przy użyciu ich nazw domyślnych
tylko dla wygody zapisu.) Na nazwy lokalne może mieć również wpływ −str
opcja; Jednakże −str opcja nie ma wpływu #definiować symbole generowane przez
Yacc.

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

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

OPERANDY


Wymagany jest następujący operand:

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 będzie plikiem tekstowym sformatowanym zgodnie z ROZSZERZONYM OPISEM


Ś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.

Połączenia JĘZYK i LC_* zmienne wpływają na wykonanie Yacc użyteczność zgodnie z opisem. The główny()
funkcja zdefiniowana w Jak Biblioteka zadzwoni:

setlocale(LC_ALL, „”)

i tym samym program wygenerowany przez Yacc treść tych dokumentów również będzie miała wpływ
zmienne w czasie wykonywania.

ASYNCHRONICZNY WYDARZENIA


Domyślna.

STDOUT


Nieużywany.

STDERR


Jeśli zostaną wykryte konflikty przesunięcia/zmniejszenia lub zmniejszenia/zmniejszenia w gramatyka, Yacc napiszę
raport tych konfliktów na błąd standardowy w nieokreślonym formacie.

Błąd standardowy należy również stosować w komunikatach diagnostycznych.

WYDAJNOŚĆ AKTA


Plik kodu, plik nagłówkowy i plik opisu powinny być plikami tekstowymi. Wszyscy są
opisane w poniższych sekcjach.

Code filet
Plik ten będzie zawierał kod źródłowy C dla parse() funkcja. Zawiera
kod dla różnych działań semantycznych z wykonywaną na nich podstawieniem makr jako
opisane w części OPIS ROZSZERZONY. Zawiera także kopię #definiować
instrukcje w pliku nagłówkowym. Jeśli %unia używana jest deklaracja, deklaracja for
W pliku tym powinien znaleźć się także YYSTYPE.

Nagłówek filet
Plik nagłówkowy powinien zawierać #definiować instrukcje, które łączą numery tokenów z
nazwy tokenów. Umożliwia to plikom źródłowym innym niż plik kodu dostęp do kodów tokenów.
Jeśli %unia używana jest deklaracja, deklaracja YYSTYPE i an zewnętrzny YYSTYP Yylval
oświadczenie zostanie również dołączone do tego pliku.

Opis filet
Plik opisu powinien być plikiem tekstowym zawierającym opis maszyny stanów
odpowiadający parserowi, używając nieokreślonego formatu. Limity dla tabel wewnętrznych (patrz
Limity) należy również zgłosić w sposób zdefiniowany w ramach wdrażania. (Niektóre wdrożenia
mogą stosować techniki alokacji dynamicznej i nie mają określonych wartości granicznych do zgłaszania.)

ROZSZERZONY OPIS


Połączenia Yacc polecenie akceptuje język używany do definiowania gramatyki dla języka docelowego
do analizy przez tabele i kod wygenerowany przez Yacc. Język akceptowany przez Yacc jak
gramatykę języka docelowego opisano poniżej za pomocą Yacc sam język wejściowy.

Wejście gramatyka zawiera reguły opisujące strukturę wejściową języka docelowego oraz
kod, który ma zostać wywołany po rozpoznaniu tych reguł, aby zapewnić powiązaną semantykę
działanie. Kod do wykonania powinien pojawić się jako tekst, który ma być C-
kod języka. Te fragmenty tekstu nie mogą zawierać trójznaków w języku C. Język C
Zakłada się, że inkluzje tworzą prawidłową funkcję po przetworzeniu przez Yacc w jego wyjście
akta. Kod zawarty w ten sposób zostanie wykonany podczas rozpoznawania
język docelowy.

Biorąc pod uwagę gramatykę, Yacc Narzędzie generuje pliki opisane w PLIKACH WYJŚCIOWYCH
Sekcja. Plik kodu można skompilować i połączyć za pomocą c99. Jeżeli oświadczenie i
sekcje programu pliku gramatycznego nie zawierały definicji główny() yylex(), oraz
yy błąd(), skompilowane dane wyjściowe wymagają połączenia z ich wersjami dostarczonymi zewnętrznie
Funkcje. Domyślne wersje główny() i yy błąd() są dostarczane w Yacc biblioteka i
można połączyć za pomocą -l y argument do c99, Yacc interfejsy biblioteczne nie muszą
obsługuje interfejsy inne niż domyślne yy przedrostek symbolu. Aplikacja zapewnia
funkcja analizatora leksykalnego, yylex(); the lex narzędzie zostało specjalnie zaprojektowane
wygenerować taką rutynę.

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

Dane wejściowe to dowolny tekst zgodny ze strukturą gramatyczną zdefiniowaną poniżej.

Leksykalny Structure of dotychczasowy Gramatyka
The , , I znak powinien być ignorowany, z wyjątkiem tego, że
aplikacja zapewnia, że ​​nie pojawiają się one w nazwach lub nazwach wieloznakowych zastrzeżonych
symbolika. Komentarze należy zamieścić w "/* ... */"i może pojawić się wszędzie tam, gdzie znajduje się nazwa
ważny.

Nazwy mają dowolną długość i 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 należy używać nazw rozpoczynających się od yy or YY ponieważ Yacc parser używa takich nazw. Wiele
nazwy pojawiają się w końcowym wyniku Yacci dlatego należy je dobrać tak, aby były zgodne
z wszelkimi dodatkowymi regułami utworzonymi przez kompilator C do użycia. W szczególności się pojawiają
in #definiować sprawozdania.

Literal powinien składać się z pojedynczego znaku ujętego w pojedynczy cudzysłów. Wszystkie z
powinny być sekwencje specjalne obsługiwane dla stałych znakowych przez normę ISO C
wspierany przez Yacc.

Relację z analizatorem leksykalnym omówiono szczegółowo poniżej.

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

Deklaracje Sekcja
Sekcja deklaracji służy do zdefiniowania 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
podane tutaj.

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

Możliwe jest również zachowanie informacji semantycznych związanych z aktualnie włączonymi tokenami
stos analizy w zdefiniowanym przez użytkownika języku C unia, jeżeli 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 być poprzedzone nazwą członka związku C (zwanego a etykieta poniżej) pojawia się
w ciągu '<' i '>'. (Jako wyjątek od konwencji typograficznych pozostałych
w tym przypadku tom POSIX.1-2008etykieta> nie reprezentuje metazmiennej, ale
dosłowne znaki nawiasu ostrokątnego otaczające symbol.) Użycie etykieta określa, że
tokeny wymienione w tej linii muszą być tego samego typu C, co członek związku, do którego się odwołuje
etykieta. Omówiono to 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 mu do celów leksykalnych, uważa się za ten numer.

Oświadcza, co następuje Nazwa być symbolem:

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

If etykieta jest obecny, typ C dla wszystkich tokenów w tej linii zostanie zadeklarowany jako typ
do którego odwołuje się etykieta. Jeśli dodatnia liczba całkowita, numer, następuje Nazwa, wartość ta wynosi
przypisany do tokena.

Oświadcza, co następuje Nazwa być tokenem i przypisać mu pierwszeństwo:

%lewy [<etykieta>] Nazwa [numer] [Nazwa [numer]]...
%Prawidłowy [<etykieta>] Nazwa [numer] [Nazwa [numer]]...

W tej sekcji może pojawić się jedna lub więcej linii, każda zaczynająca się od jednego z tych symboli.
Wszystkie tokeny w tej samej linii mają ten sam poziom pierwszeństwa i powiązania; linie
są uporządkowane według rosnącego pierwszeństwa lub siły wiązania. %lewy oznacza, że
operatory na tej linii pozostają skojarzone, i %Prawidłowy podobnie oznacza rację
operatory asocjacyjne. Jeśli etykieta jest obecny, powinien zadeklarować typ C dla Nazwajest zgodny z opisem
dla %znak.

Oświadcza, co następuje Nazwa być tokenem i wskazuje, że nie można go użyć
skojarzeniowo:

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

Jeśli parser napotka asocjacyjne użycie tego tokena, zgłosi błąd. Jeśli etykieta is
jest obecny, deklaruje typ C dla Nazwajest zgodny z opisem %znak.

Poniżej oświadcza, że ​​członek związku Nazwas nie są terminalami i dlatego jest to wymagane
mieć etykieta pole na jego początku:

%rodzaj <etykieta> Nazwa...

Ponieważ dotyczy tylko terminali innych niż terminale, przypisanie numeru tokena lub użycie literału is
również zabronione. Jeśli ta konstrukcja jest obecna, Yacc przeprowadza kontrolę typu; Jeśli to
konstrukt nie jest obecny, stos analizy będzie zawierał tylko int rodzaj.

Każde imię użyte w gramatyka nie zdefiniowany przez a %znak, %lewy, %Prawidłowylub %nienassoc
Zakłada się, że deklaracja reprezentuje symbol nieterminalny. The Yacc przedsiębiorstwo użyteczności publicznej zgłosi
błąd dla dowolnego symbolu nieterminalnego, który nie pojawia się po lewej stronie co najmniej jednego
reguła gramatyczna.

Jeśli zostanie określony typ, pierwszeństwo lub numer symboliczny nazwy, nie będzie tak
zmieniony. Jeżeli pierwsza deklaracja tokena nie przypisuje numeru tokena, Yacc powinien
przypisać numer tokena. Po dokonaniu tego przypisania numer tokenu nie podlega zmianie
poprzez wyraźne przypisanie.

Poniższe deklaratory nie są zgodne z poprzednim wzorcem.

Poniżej deklaruje się, że nie jest to terminal 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; to ustawienie domyślne może być
przesłonięty tą deklaracją.

Poniżej stwierdza się Yacc stos wartości będący sumą różnych typów wartości
pożądany.

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

Treść unii nie może zawierać niezrównoważonych tokenów przetwarzania wstępnego w nawiasach klamrowych.

Domyślnie wartości zwracane przez akcje (patrz poniżej) i analizator leksykalny będą takie
typu int, Yacc Narzędzie śledzi typy i wstawia odpowiednie
nazwy członków unii, aby przeprowadzić ścisłą kontrolę typu wynikowego parsera.

Alternatywnie, biorąc pod uwagę, że co najmniej jedenetykieta> używana jest konstrukcja, można zadeklarować unię
w pliku nagłówkowym (który należy uwzględnić w sekcji deklaracji za pomocą rozszerzenia a #zawierać
konstruować wewnątrz %{ i %}) i typedef używany do definiowania symbolu YYSTYPE, który ma być reprezentowany
ten związek. Efekt %unia polega na dostarczeniu deklaracji YYSTYPE bezpośrednio z
dotychczasowy Yacc wkład.

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

%{ ... %}

Instrukcje te zostaną skopiowane do pliku kodu i będą miały w nim zasięg globalny
aby można było je wykorzystać w regulaminach i sekcjach programu. Oświadczenia nie zawierają
"%}" poza komentarzem, literałem ciągu lub stałą wieloznakową.

Aplikacja zadba o to, aby sekcja deklaracji została zakończona tokenem %%.

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 oraz dodatkowe pierwszeństwo
Informacja. Poniżej opisano gramatykę i podano formalną definicję.

Sekcja reguł składa się z jednej lub większej liczby reguł gramatycznych. Reguła gramatyczna ma postać:

A : Tułów ;

Symbol A reprezentuje nazwę nieterminalną i Tułów reprezentuje ciąg zerowy lub
jeszcze Nazwas, dosłownys, i semantyczny akcjas, po którym może nastąpić opcja
precedens rządzićS. Tylko nazwy i literały uczestniczą w tworzeniu się
gramatyka; akcje semantyczne i reguły pierwszeństwa są wykorzystywane w inny sposób. The I
the Czy Yacc interpunkcja. Jeśli istnieje kilka kolejnych reguł gramatycznych with
ta sama lewa strona, tj ('|') można zastosować, aby uniknąć przepisywania pliku
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 element nie jest terminalem
symbol pasuje do pustego ciągu.

Połączenia Yacc narzędzie przypisuje unikalny numer do każdej reguły. Reguły wykorzystujące pionowy pasek
notacja to odrębne zasady. Numer przypisany do reguły pojawia się w opisie
plik.

Elementy składające się na CIAŁO to:

Nazwa, dosłowny
Tworzą one reguły gramatyczne: Nazwa jest albo żeton lub nieterminalny;
dosłowny oznacza samo siebie (pomniejszone o wymagane leksykalnie cudzysłowy).

semantyczny akcja
Z każdą regułą gramatyczną użytkownik może skojarzyć czynności, które należy wykonać za każdym razem
reguła jest rozpoznawana w procesie wejściowym. (Zauważ, że słowo „akcja” może
odnoszą się także do działań parsera — przesuwania, zmniejszania itd.)

Te akcje mogą zwracać wartości i mogą uzyskać wartości zwrócone przez poprzednie
działania. Wartości te przechowywane są w obiektach typu YYSTYPE (patrz %unia).
wartość wyniku akcji będzie przechowywana na stosie analizy lewą ręką
stronie reguły, do której będą miały dostęp inne redukcje jako część ich prawej ręki
strona. Korzystając zetykieta> informacje podane w sekcji deklaracji,
kod wygenerowany przez Yacc mogą być ściśle sprawdzane pod kątem typu i zawierać dowolne
Informacja. Ponadto analizator leksykalny może zapewnić te same rodzaje
wartości tokenów, jeśli to konieczne.

Akcja jest dowolną instrukcją C i jako taka może wykonywać operacje wejściowe lub wyjściowe, wywoływać
podprogramów i zmieniać zmienne zewnętrzne. Akcja to jedna lub więcej instrukcji C
ujęte w nawiasy klamrowe '{' i '}'. Oświadczenia nie zawierają
niezrównoważone tokeny wstępnego przetwarzania nawiasów klamrowych.

W akcji można zastosować pewne pseudozmienne. Są to makra umożliwiające dostęp
do struktur danych znanych wewnętrznie Yacc.

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

$numer Odnosi się to do wartości zwracanej przez komponent określony przez
żeton numer po prawej stronie reguły, czytając od lewej do prawej;
numer może być zerowa lub ujemna. Jeśli numer wynosi zero lub jest ujemna
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 nazwy bezpośrednio poprzedzającej nazwę znajdującą się najbardziej na lewo w
aktualną regułę można znaleźć na stosie parsera i „$-1” odnosi się do
symbol do jego w lewo.) Jeśli numer odnosi się do elementu znajdującego się za prądem
punkt w regule lub poza spód stosu, wynik jest taki
nieokreślony. Jeśli włączone jest sprawdzanie typu i typ wartości, która ma być
przydzielonego nie można określić, może zostać wygenerowany komunikat diagnostyczny.

$<etykieta>numer
Odpowiadają one dokładnie odpowiednim symbolom bez etykieta
włączenie, ale pozwalają na ścisłe sprawdzanie typu (i wykluczają niechciane
konwersje typów). Efekt jest taki, że makro jest rozbudowane do użycia etykieta
aby wybrać element z unii YYSTYPE (używając nazwadanych.tag).
Jest to szczególnie przydatne, jeśli numer nie jest pozytywne.

$<etykieta>$ Narzuca to odniesienie typ członu związku, do którego się odwołuje
by etykieta. Konstrukcja ta ma zastosowanie w przypadku odniesienia do lewej strony
Wartość kontekstu występuje w gramatyce i zapewnia Yacc ze środkiem
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 i z kolei wartość, którą zwraca, może być
dostępne poprzez akcje po jego prawej stronie. Akcja pojawiająca się w środku reguły
będzie równoznaczne z zastąpieniem akcji nowym, nieterminalnym symbolem i
dodanie pustej reguły z tym nieterminalnym symbolem po lewej stronie. The
akcja semantyczna związana z nową regułą będzie równoważna z pierwotną
działanie. Użycie akcji w ramach reguł może spowodować konflikty, które nie wystąpią
inaczej istnieje.

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

precedens
Słowo kluczowe %prec można użyć do zmiany poziomu pierwszeństwa powiązanego z a
konkretna reguła gramatyczna. Przykładami tego są przypadki, w których występuje jednoargumentowy i binarny
operator mają tę samą reprezentację symboliczną, ale muszą mieć inną reprezentację
precedensy lub gdy obsługa niejednoznacznej konstrukcji if-else jest
niezbędny. Zastrzeżony symbol %prec może pojawić się bezpośrednio po ciele
regułę gramatyczną i może po niej następować nazwa symboliczna lub literał. Powinno
spowodować, że reguła gramatyczna stanie się priorytetem następującego tokenu
imię lub dosłowne. Można wykonać działanie dla reguły jako całości %prec.

Jeśli następuje sekcja programu, aplikacja zapewnia przestrzeganie zasad gramatycznych
zakończony przez %%.

Programy Sekcja
Połączenia programów sekcja może zawierać definicję analizatora leksykalnego yylex(), i jakikolwiek
inne funkcje; na przykład te używane w działaniach określonych w regułach gramatycznych. To
nie jest określone, czy sekcja programów poprzedza czy następuje po akcjach semantycznych
plik wyjściowy; dlatego jeśli aplikacja zawiera jakiekolwiek definicje makr i
deklaracje przeznaczone do zastosowania do kodu w działaniach semantycznych, umieszcza je
w ciągu „%{ ... %}" w sekcji deklaracji.

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

Struktura leksykalna jest zdefiniowana mniej precyzyjnie; Leksykalny Structure of dotychczasowy Gramatyka definiuje
większość terminów. Zgodność pomiędzy poprzednimi warunkami a poniższymi tokenami jest następująca
Następuje.

IDENTYFIKATOR Odpowiada to koncepcji Nazwa, podane wcześniej. Zawiera również
literały, jak zdefiniowano wcześniej.

C_IDENTIFIER
Jest to nazwa, a dodatkowo wiadomo, że po niej występuje a . A
literał nie może dać tego tokenu.

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

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

{ ... } Oznacza kod źródłowy języka C, z możliwością dołączenia „$”
makra, jak omówiono wcześniej.

/* Gramatyka dla dotychczasowy wkład do tak. */
/* Basic wpisy. */
/* Połączenia następujący jest uznane by dotychczasowy leksykalny analizator. */

%token IDENTIFIER /* Zawiera identyfikatory i literały */
%token C_IDENTIFIER /* identyfikator (ale nie dosłowny)
następnie:. */
%token LICZBA /* [0-9][0-9]* */

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

%token LEWY PRAWY NONASSOC TOKEN PREC TYP UNIA STARTOWA

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

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

%start spec

%%

spec: defs MARK rządzi ogonem
;
ogon: MAREK
{
/* W tej akcji skonfiguruj pozostałą część pliku. */
}
| /* Pusty; drugi ZNAK jest opcjonalny. */
;
defs : /* Puste. */
| zdecydowanie zdecydowanie
;
def : IDENTYFIKATOR POCZĄTKU
| UNIA
{
/* Skopiuj definicję unii na wyjście. */
}
| LCURL
{
/* Skopiuj kod C do pliku wyjściowego. */
}
RCURL
| znacznik rword nlist
;
słowo: TOKEN
| LEWY
| PRAWIDŁOWY
| NONASOC
| TYP
;
tag : /* Pusty: identyfikator tagu union jest opcjonalny. */
| '<' IDENTYFIKATOR '>'
;
nlista: nmnr
| nlist nmno
;
nmno : IDENTYFIKATOR /* Uwaga: literał jest nieprawidłowy w przypadku typu %. */
| NUMER IDENTYFIKACYJNY /* Uwaga: niepoprawny przy typie %. */
;

/* Sekcja reguł */

zasady: C_IDENTIFIER rbody prec
| zasady rządzą
;
reguła: C_IDENTIFIER rbody prec
| '|' rbody prec
;
rbody: /* puste */
| IDENTYFIKATOR ciała
| ciało, akt
;
działać : '{'
{
/* Kopiuj akcję, tłumacz $$ i tak dalej. */
}
'}'
;
prec: /* Puste */
| IDENTYFIKATOR PRECÓW
| Ustawa o IDENTYFIKATORze PREC
| prec ';'
;

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

Konflikty to albo przesunięcie/zmniejszenie konfliktów, albo zmniejszenie/zmniejszenie konfliktów. Przesunięcie/redukcja
konflikt ma miejsce, gdy dla danego stanu i symbolu wyprzedzania występuje zarówno akcja przesunięcia, jak i a
możliwe jest ograniczenie działań. Konflikt redukcji/redukcji występuje tam, gdzie dla danego stanu i
symbol wyprzedzenia, możliwe są redukcje według dwóch różnych zasad.

Poniższe zasady opisują, jak określić, jakie działania należy podjąć w przypadku wystąpienia konfliktu. Nie
wszystkie konflikty związane z przesunięciem/redukcją można pomyślnie rozwiązać w ten sposób, ponieważ konflikt może
wynikać z czegoś innego niż dwuznaczność, więc nieostrożne korzystanie z tych udogodnień może spowodować
język zaakceptowany przez parser jest znacznie inny od zamierzonego. The
plik opisu powinien zawierać wystarczające informacje, aby zrozumieć przyczynę
konflikt. Tam, gdzie przyczyną jest niejednoznaczność, powinny być stosowane reguły domyślne lub jawne
wystarczające do stworzenia działającego parsera.

Deklarowane pierwszeństwa i powiązania (patrz Deklaracje Sekcja) są używane do
rozwiązuj konflikty analizowania w następujący sposób:

1. Z każdą regułą gramatyczną powiązane jest pierwszeństwo i łączność; to jest
pierwszeństwo i powiązanie ostatniego tokenu lub literału w treści reguły. Jeśli
dotychczasowy %prec używane jest słowo kluczowe, zastępuje ono to ustawienie domyślne. Niektóre reguły gramatyczne mogą nie
mają zarówno pierwszeństwo, jak i łączność.

2. Jeśli występuje konflikt przesunięcia/zmniejszenia, zarówno w przypadku reguły gramatycznej, jak i symbolu wejściowego
mają pierwszeństwo i skojarzenie z nimi powiązane, wówczas konflikt zostaje rozwiązany
na korzyść akcji (przesunięcie lub redukcja) powiązanej z wyższym priorytetem. Jeśli
priorytety są takie same, wówczas stosuje się skojarzenie; lewe skojarzenie oznacza
redukuj, prawe skojarzenie oznacza przesunięcie, a brak skojarzenia oznacza błąd w
analizowany ciąg znaków.

3. Kiedy istnieje konflikt przesunięcie/zmniejszenie, którego nie można rozwiązać za pomocą reguły 2, następuje przesunięcie
zrobione. Rozwiązane w ten sposób konflikty zliczane są na wyjściu diagnostycznym opisanym w
Błąd Prowadzenie.

4. W przypadku konfliktu redukcja/redukcja redukcja odbywa się zgodnie z regułą gramatyczną, która brzmi:
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ązane poprzez pierwszeństwo lub łączenie nie będą wliczane do przesunięcia/zmniejszenia
i redukować/ograniczać konflikty zgłaszane przez Yacc albo w przypadku błędu standardowego, albo w pliku
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ładniowy. The
domyślna wartość błąd powinna wynosić 256. Jego wartość można zmienić za pomocą a %znak deklaracja.
Analizator leksykalny nie powinien zwracać wartości błąd.

Parser wykrywa błąd składni, gdy znajduje się w stanie, w którym dana akcja jest powiązana
z symbolem wyprzedzania jest błąd. Akcja semantyczna może spowodować zainicjowanie parsera
obsługa błędów poprzez wykonanie makra YYERROR. Kiedy wykonywany jest YYERROR, semantic
akcja przekazuje kontrolę z powrotem do parsera. YYERROR nie może być używany poza semantycznym
działania.

Kiedy parser wykryje błąd składni, zwykle wywołuje yy błąd() z postacią
ciąg "składnia błąd" jako jej argument. Wywołanie nie zostanie wykonane, jeśli parser jest nieruchomy
przywracanie poprzedniego błędu w przypadku jego wykrycia. Uważa się, że parser
będzie wracał do zdrowia po poprzednim błędzie, dopóki parser nie przesunie się o co najmniej trzy
normalne symbole wejściowe od wykrycia ostatniego błędu lub wykonania akcji semantycznej
makro yerrok. Parser nie wywoła yy błąd() gdy wykonywany jest YYERROR.

Funkcja makro YYRECOVERING zwróci 1 w przypadku wykrycia błędu składniowego i
parser nie został jeszcze w pełni odzyskany. W przeciwnym razie zwracane jest zero.

Jeżeli parser wykryje błąd składniowy, parser sprawdzi, czy została zachowana poprzednia składnia
wykryto błąd. Jeśli wykryto poprzedni błąd i brak normalnych symboli wejściowych
zostały przesunięte od czasu wykrycia poprzedniego błędu, parser sprawdza, czy
symbol wyprzedzania jest znacznikiem końcowym (patrz Interfejs do dotychczasowy Leksykalny Analizator). Jeśli tak jest, to
parser zwróci wartość różną od zera. W przeciwnym razie symbolem wyprzedzania będzie
zostanie odrzucony i wznowione zostanie normalne analizowanie.

Gdy zostanie wykonany YYERROR lub gdy parser wykryje błąd składniowy i brak poprzedniego błędu
został wykryty lub co najmniej jeden normalny symbol wejściowy został przesunięty w stosunku do poprzedniego
wykryto błąd, parser będzie wyświetlał jeden stan na raz, aż stos analizy będzie gotowy
pusty lub bieżący stan pozwala na przesunięcie błąd. Jeśli parser opróżnia plik parse
stosie, zwróci wartość różną od zera. W przeciwnym razie nastąpi przesunięcie błąd i
następnie wznów normalne analizowanie. Jeśli parser odczyta symbol wyprzedzania przed wystąpieniem błędu
wykryty, symbol ten będzie nadal symbolem wyprzedzającym po wznowieniu analizowania.

Makro yerrok w akcji semantycznej spowoduje, że parser będzie działał tak, jakby działał w pełni
odzyskane po wszelkich wcześniejszych błędach. Makro yyclearyna spowoduje odrzucenie parsera
aktualny token wyprzedzania. Jeśli bieżący token lookahead nie został jeszcze odczytany,
yyclearyna nie będzie miało żadnego skutku.

Makro YYACCEPT spowoduje, że parser zwróci wartość zero. Makro YYABORT
spowoduje, że parser zwróci wartość różną od zera.

Interfejs do dotychczasowy Leksykalny Analizator
Połączenia yylex() jest funkcją o wartościach całkowitych, która zwraca a żeton numer
reprezentujący rodzaj odczytanego tokena. Jeśli z tokenem jest powiązana wartość
zwrócone przez yylex() (zobacz dyskusję etykieta powyżej), należy go przypisać do
zmienna zewnętrzna Yylval.

Jeśli parser i yylex() nie zgadzam się na te numery tokenów, rzetelna komunikacja
między nimi nie może nastąpić. W przypadku literałów (znaków jednobajtowych) tokenem jest po prostu
wartość numeryczna znaku w bieżącym zestawie znaków. Numery pozostałych żetonów
może zostać wybrany przez Yacclub wybrane przez użytkownika. W obu przypadkach #definiować skonstruować
C służy do umożliwienia yylex() aby symbolicznie zwrócić te liczby. The #definiować oświadczenia
są umieszczane w pliku kodu i pliku nagłówkowym, jeśli taki plik jest wymagany. Zestaw
znaki dozwolone przez Yacc w identyfikatorze jest większy niż dopuszczalny przez C. Token
Nazwy, w przypadku których stwierdzono, że zawierają takie znaki, nie są uwzględniane w #definiować deklaracje.

Jeżeli numery żetonów zostaną wybrane przez Yacc, przypisane zostaną tokeny inne niż literały
liczby większe niż 256, chociaż nie jest implikowana żadna kolejność. Token można jawnie przypisać
liczbę, po jej pierwszym pojawieniu się w sekcji deklaracji liczbą.
Nazwy i literały niezdefiniowane w ten sposób zachowują swoją domyślną definicję. Wszystkie numery tokenów
przypisane przez Yacc powinny być unikalne i różne od numerów tokenów używanych w literałach i
tokeny przypisane przez użytkownika. Jeśli zduplikowane numery tokenów powodują konflikty w generowaniu parsera,
Yacc zgłosi błąd; w przeciwnym razie nie jest określone, czy przypisanie tokenu jest
zaakceptowane lub zgłoszono błąd.

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

Kończenie dotychczasowy Program
Oprócz parse() i yylex(), funkcje yy błąd() i główny() są potrzebne do
zrobić kompletny program. Aplikacja może dostarczyć główny() i yy błąd() lub te
procedury można uzyskać od Yacc biblioteka.

Jak Biblioteka
Następujące funkcje pojawiają się tylko w Yacc biblioteka dostępna przez -l y
argument do c99; można je zatem przedefiniować za pomocą zgodnej aplikacji:

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

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

Kolejność -l y i -l l operandy podane c99 jest znaczący; aplikacja powinna
albo zapewnij własne główny() działać lub zapewniać to -l y poprzedza -l l.

Debugowanie dotychczasowy Parser
Parser wygenerowany przez Yacc powinien posiadać wyposażenie diagnostyczne, które może być opcjonalne
włączone w czasie kompilacji lub w czasie wykonywania (jeśli jest włączone w czasie kompilacji). The
Kompilacja kodu debugującego środowiska wykonawczego odbywa się pod kontrolą preprocesora YYDEBUG
symbol. Jeżeli YYDEBUG ma wartość różną od zera, należy uwzględnić kod debugujący. Jeśli to jest
wartość wynosi zero, kod nie zostanie uwzględniony.

W parserach, w których uwzględniono kod debugowania, plik external int yydebug może być
służy do włączania debugowania (przy wartości niezerowej) i wyłączania (wartość zerowa) w czasie wykonywania. The
wartość początkowa yydebug będzie wynosić zero.

Kiedy −t zostanie określony, plik kodu zostanie zbudowany w taki sposób, jeśli YYDEBUG jeszcze nie jest
zdefiniowane w czasie kompilacji (przy użyciu metody c99 −D na przykład opcja YYDEBUG), YYDEBUG to zrobi
być ustawione jawnie na 1. Kiedy −t nie jest określony, plik kodu zostanie zbudowany w taki sposób, że:
jeżeli YYDEBUG nie jest jeszcze zdefiniowany, należy go jawnie ustawić na zero.

Format wyników debugowania jest nieokreślony, ale zawiera co najmniej wystarczającą ilość informacji
w celu określenia działań związanych z przesunięciem i redukcją oraz symboli wejściowych. Zapewnia również
informacje o usuwaniu błędów.

Algorytmy
Parser zbudowany przez Yacc wdraża i LALR(1) algorytm analizowania zgodnie z dokumentacją w
literatura. Nie jest określone, czy parser jest sterowany tabelą, czy kodowany bezpośrednio.

Parser generowany przez Yacc nigdy nie będzie żądał symbolu wejściowego od yylex() będąc w
stan, w którym jedynymi działaniami innymi niż działanie związane z błędem są redukcje o jedną regułę.

Literatura teorii analizowania definiuje te pojęcia.

Limity
Połączenia Yacc Narzędzie może mieć kilka tabel wewnętrznych. Minimalne maksima dla tych tabel
przedstawiono w poniższej tabeli. Dokładne znaczenie tych wartości to implementacja-
zdefiniowany. Implementacja określa relację pomiędzy tymi wartościami oraz pomiędzy
je oraz wszelkie komunikaty o błędach, które może wygenerować implementacja w przypadku ich wyczerpania
miejsce na dowolną konstrukcję wewnętrzną. Implementacja może łączyć grupy tych zasobów
do jednej puli, o ile suma dostępna użytkownikowi nie spadnie poniżej kwoty
o rozmiarach 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ł. │
│{NSTANY} │ 600 │ Liczba stanów. │
│{MEMSIZE} │ 5200 │ Długość reguł. Razem │
│ │ │ długość, w nazwach (żetony i │
│ │ │ nieterminale), ze wszystkich │
│ │ │ zasady gramatyki. │
│ │ │ lewa strona jest liczona dla │
│ │ │ każdą regułę, nawet jeśli nią nie jest │
│ │ │ wyraźnie powtórzone, jako │
│ │ │ określone w Gramatyka Zasady in
│ │ Yacc. │.
│{ACTSIZE} │ 4000 │ Liczba akcji. ``Działania'' │
│ │ │ tutaj (oraz w opisie │
│ │ │ plik) odnoszą się do działań analizatora składni │
│ │ │ (przesunięcie, zmniejszenie itd.) nie │
│ │ │ do działań 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, przebieg zostaje przerwany i Yacc kończy się ze statusem niezerowym.
Mogą zostać utworzone częściowe pliki kodu i pliki nagłówkowe. Podsumowanie informacji w
plik opisu powinien być zawsze generowany, jeśli plik -w flaga jest obecna.

Połączenia następujący działy jest informacyjny.

WNIOSEK ZASTOSOWANIE


W implementacjach historycznych występują konflikty nazw yacc.tmp, yacc.akty,
yacc.debug, y.tab.c, y.tab.h, y.wyjście jeśli więcej niż jedna kopia Yacc biegnie w
pojedynczy katalog na raz. The −b dodano opcję eliminującą ten problem. The
powiązany problem zezwalania na wiele Yacc parsery do umieszczenia w tym samym pliku
rozwiązano, dodając a −str opcję zastąpienia wcześniej zakodowanego yy zmienny przedrostek.

Opis −str opcja określa minimalny zestaw nazw funkcji i zmiennych
które powodują konflikt, gdy wiele parserów jest ze sobą połączonych. YYSTYPE nie musi tak być
zmieniony. Zamiast tego programista może użyć −b aby podać pliki nagłówkowe dla różnych analizatorów składni
różne nazwy, a następnie plik z rozszerzeniem yylex() dla danego parsera może zawierać
nagłówek dla tego parsera. Imiona takie jak ywyczyśćrr nie trzeba ich zmieniać, bo tak jest
są używane tylko w akcjach; nie mają powiązania. Możliwe, że A
implementacja ma inne nazwy, albo wewnętrzne, służące do implementowania takich rzeczy, jak
ywyczyśćrrlub dostarczanie niestandardowych funkcji, z którymi chce się zmieniać −str.

Operatory jednoargumentowe, które są tym samym tokenem co operator binarny, na ogół ich potrzebują
pierwszeństwo dostosowane. Zajmuje się tym %prec symbol doradczy związany z
szczególna reguła gramatyczna definiująca ten operator jednoargumentowy. (Widzieć Gramatyka Zasady in Yacc.)
Aplikacje nie muszą używać tego operatora w przypadku operatorów jednoargumentowych, ale w gramatyce
które tego nie wymagają, są rzadkie.

PRZYKŁADY


Dostęp do Yacc bibliotekę uzyskuje się za pomocą operandów wyszukiwania biblioteki 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, więc jej główny() Jest używane.

Historyczne Yacc biblioteki zawierały dwie proste funkcje, które są zwykle kodowane
przez programistę aplikacji. Funkcje te są podobne do poniższego kodu:

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

setlocale(LC_ALL, "");

/* Jeśli następujący parser jest parserem utworzonym przez Lexa, plik
aplikacja musi zachować ostrożność, aby upewnić się, że LC_CTYPE
i LC_COLLATE są ustawione na ustawienia regionalne POSIX. */
(puste) yyparse();
powrót (0);
}

#włączać

int błąd(const char *msg)
{
(void) fprintf(stderr, "%s\n", msg);
powrót (0);
}

RACJONALNE UZASADNIENIE


Referencje w Referencje dokumenty może być pomocny w konstruowaniu parsera
generator. Przywoływany artykuł DeRemera i Pennello (wraz z dziełami it
odniesienia) opisuje technikę generowania parserów zgodnych z tym tomem
POSIX.1-2008. Prace w tym obszarze są w dalszym ciągu prowadzone, dlatego też realizatorzy powinni zasięgnąć opinii
aktualną literaturę przed wykonaniem jakichkolwiek nowych wdrożeń. Oryginalny artykuł Knutha to
podstawy teoretyczne dla tego rodzaju parsera, ale generowane przez niego tabele są niepraktyczne
duże dla rozsądnej gramatyki i nie należy ich używać. Sformułowanie „równoważne” to
zamierzone, aby zapewnić najlepsze stoły, jakie są LALR(1) można wygenerować.

Nastąpiło zamieszanie pomiędzy klasą gramatyk i algorytmami potrzebnymi do wygenerowania
parsery i algorytmy potrzebne do analizowania języków. Wszystkie są rozsądne
prostokątny. W szczególności generator parsera, który akceptuje pełny zakres LR(1)
gramatyki nie muszą generować tabeli bardziej złożonej niż ta, która akceptuje SLR(1) (ur
stosunkowo słaba klasa gramatyk LR) dla gramatyki, która tak się składa SLR(1). Taki
wdrożenie również nie musi uwzględniać przypadku; kompresja tabeli może dać SLR(1)
tabeli (lub jeszcze mniejszej), nie zdając sobie sprawy, że gramatyka jest SLR(1). The
prędkość LR(1) parser dla dowolnej klasy jest bardziej zależny od reprezentacji tabeli i
kompresję (lub generowanie kodu, jeśli generowany jest bezpośredni parser) niż w klasie
gramatyki, którą obsługuje generator tabel.

Szybkość generatora parsera zależy w pewnym stopniu od klasy gramatyki
uchwyty. Jednak oryginalne algorytmy artykułu Knutha do konstruowania parserów LR były
oceniane przez autora jako niepraktycznie powolne w tamtym czasie. Chociaż pełny LR to więcej
złożone niż LALR(1), w miarę poprawy szybkości komputerów i algorytmów, różnica (w zakresie
dopuszczalnego czasu wykonania zegara ściennego) staje się coraz mniej istotne.

Potencjalnych autorów ostrzega się, że cytowany artykuł DeRemera i Pennello
cytowany wcześniej identyfikuje błąd (nadmierne uproszczenie obliczeń LALR(1)
zestawy lookahead) w niektórych z LALR(1) instrukcje algorytmu, które go poprzedzały
opublikowanie. Powinni poświęcić czas na odszukanie tego artykułu, a także aktualnych informacji
pracy, zwłaszcza Aho.

Połączenia −b dodano opcję zapewniającą przenośną metodę wydawania zezwoleń Yacc pracować nad
wiele oddzielnych analizatorów składni w tym samym katalogu. Jeśli katalog zawiera więcej niż jeden
Yacc gramatyki, przy czym obie gramatyki są konstruowane w tym samym czasie (przez np
równolegle robić program), skutki konfliktu. Chociaż rozwiązaniem nie jest praktyka historyczna,
koryguje znane braki w historycznych wdrożeniach. Odpowiednie zmiany były
dokonano we wszystkich sekcjach, które odwoływały się do nazw plików y.tab.c (teraz „plik kodu”),
y.tab.h (teraz „plik nagłówkowy”), i y.wyjście (teraz „plik opisu”).

Gramatyka dla Yacc dane wejściowe są oparte na dokumentacji Systemu 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_IDENTIFIER powoduje wystąpienie redukcji w
dobre miejsce.)

Ponadto w tej implementacji konstrukcje takie jak %znak może zostać zakończone przez a
, ale nie jest to dozwolone przez gramatykę. Słowa kluczowe takie jak %znak mogą
pojawiają się również wielkimi literami, co ponownie 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 „\<”).

Historycznie rzecz biorąc,etykieta> może zawierać dowolne znaki z wyjątkiem '>', łącznie z białymi znakami, w pliku
realizacja. Jednakże od etykieta musi odnosić się do członka związku spełniającego 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 a
okres. Implementacje historyczne często na to pozwalają „$” w nazwach. Zgodna implementacja
nie musi wspierać żadnego z tych zachowań.

Decydowanie, kiedy użyć %prec ilustruje trudność w określeniu zachowania Yacc.
Mogą zaistnieć sytuacje, w których gramatyka nie jest, ściśle mówiąc, w błędzie, a jednak
Yacc nie da się tego jednoznacznie zinterpretować. Rozwiązanie niejasności w gramatyce może
w wielu przypadkach można rozwiązać poprzez podanie dodatkowych informacji, takich jak użycie %rodzaj or
%unia deklaracje. Często jest to łatwiejsze i zwykle wymaga użycia mniejszego parsera
tę alternatywę, gdy jest to właściwe.

Rozmiar i czas wykonania programu utworzonego bez kodu debugującego w czasie wykonywania wynosi
zwykle mniejszy i nieco szybszy w historycznych wdrożeniach.

Komunikaty statystyczne z kilku historycznych wdrożeń obejmują następujące typy
informacje:

n/512 terminali, n/300 nieterminali
n/600 reguł gramatycznych, n/1500 stanów
n przesunąć/zmniejszyć, n zmniejszyć/zmniejszyć zgłaszane konflikty
n/350 wykorzystanych zestawów roboczych
Pamięć: stany itp. n/15000, parser n/ 15000
n/600 różnych zestawów przewidywań
n dodatkowe zamknięcia
n wpisy przesunięcia, n wyjątki
n mam wpisy
n wpisy zapisane domyślnie got
Wykorzystane miejsce na optymalizatorze: wejście n/15000, wyjście n/ 15000
n wpisy do tabeli, n zero
Maksymalny spread: n, Maksymalne przesunięcie: n

Raport tabel wewnętrznych w pliku opisu pozostaje zdefiniowany w implementacji
ponieważ wszystkie aspekty tych limitów są również zdefiniowane w implementacji. Niektóre wdrożenia
mogą stosować techniki alokacji dynamicznej i nie mają określonych wartości granicznych do zgłaszania.

Format y.wyjście plik nie został podany, ponieważ nie określono formatu
postrzegane jako zwiększające przenośność aplikacji. Celem aukcji jest przede wszystkim pomoc człowiekowi
użytkownicy rozumieją i debugują parser; zastosowanie y.wyjście za pomocą zgodnego skryptu aplikacji
byłoby niezwykłe. Co więcej, wdrożenia nie przyniosły spójnych wyników i nie
popularny format był oczywisty. Format wybrany przy wdrożeniu powinien być humanitarny
czytelny, oprócz wymogu, aby był to plik tekstowy.

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

Niektóre implementacje rozpoznają „={” jako odpowiednik '{' ponieważ pojawia się w historii
dokumentacja. Już dawno uznano tę konstrukcję za przestarzałą i udokumentowano ją
1978, w przyp Jak: Jeszcze Inne Kompilator-Kompilator. Ten tom POSIX.1-2008
zdecydowałem się pozostawić go jako przestarzały i pominąć.

Znaki wielobajtowe powinny zostać rozpoznane przez analizator leksykalny i zwrócone jako tokeny.
Nie powinny być zwracane jako literały znaków wielobajtowych. Znaczek błąd który jest używany
w przypadku odzyskiwania po błędzie zwykle przypisuje się wartość 256 w historycznej implementacji.
Zatem wartość tokenu 256, która jest używana w wielu zestawach znaków wielobajtowych, nie jest taka
dostępny do użycia jako wartość tokena zdefiniowanego przez użytkownika.

PRZYSZŁOŚĆ KIERUNKI


Brak.

Korzystaj z Yaccposix online, korzystając z usług onworks.net


Darmowe serwery i stacje robocze

Pobierz aplikacje Windows i Linux

  • 1
    itop — ITSM CMDB OpenSource
    itop — ITSM CMDB OpenSource
    Portal operacji IT: pełne otwarcie
    source, ITIL, usługa internetowa
    narzędzie do zarządzania, w tym w pełni
    konfigurowalny CMDB, system pomocy technicznej i
    dokumentalista...
    Pobierz itop - ITSM CMDB OpenSource
  • 2
    Clementine
    Clementine
    Clementine to muzyka wieloplatformowa
    odtwarzacz i organizator biblioteki zainspirowany
    Amarok 1.4. Ma szybki i
    łatwy w użyciu interfejs i pozwala
    szukaj i ...
    Pobierz Clementine
  • 3
    XISMuS
    XISMuS
    UWAGA: Aktualizacja zbiorcza 2.4.3 ma
    został zwolniony!! Aktualizacja działa dla każdego
    poprzednia wersja 2.xx. W przypadku aktualizacji
    od wersji v1.xx proszę pobrać i
    i ...
    Pobierz XISMuS
  • 4
    facetracknoir
    facetracknoir
    Modułowy program do śledzenia ruchów głowy
    obsługuje wiele trackerów twarzy, filtrów
    i protokoły gier. Wśród tropicieli
    to SM FaceAPI, głowica inercyjna AIC
    Śledzenie ...
    Ściągnij facetracknoir
  • 5
    Kod QR dla PHP
    Kod QR dla PHP
    PHP QR Code jest open source (LGPL)
    biblioteka do generowania QR Code,
    2-wymiarowy kod kreskowy. Oparte na
    Biblioteka libqrencode C, zapewnia API dla
    tworzenie kodu kreskowego QR Code...
    Pobierz kod QR PHP
  • 6
    freeciv
    freeciv
    Freeciv to darmowa gra turowa
    wieloosobowa gra strategiczna, w której każdy
    gracz staje się liderem a
    cywilizacji, walcząc o uzyskanie
    ostateczny cel: być...
    Pobierz FreeCiv
  • więcej »

Komendy systemu Linux

Ad