yaccposix - Bulutta Çevrimiçi

Bu, Ubuntu Online, Fedora Online, Windows çevrimiçi emülatörü veya MAC OS çevrimiçi emülatörü gibi birden fazla ücretsiz çevrimiçi iş istasyonumuzdan birini kullanarak OnWorks ücretsiz barındırma sağlayıcısında çalıştırılabilen yaccposix komutudur.

Program:

ADI


yacc — başka bir derleyici derleyicisi (GELİŞME)

SİNOPSİS


yacc [-dltv] [-b dosya_önek] [-p sym_prefix] dilbilgisi

TANIM


The yacc yardımcı program, içerikten bağımsız bir dilbilgisinin açıklamasını şurada okuyacaktır: dilbilgisi ve C yazın
ISO C standardına uygun kaynak kodu, bir kod dosyasına ve isteğe bağlı olarak başlık
bilgileri geçerli dizinde bir başlık dosyasına aktarır. Oluşturulan kaynak kodu
dışında herhangi bir tanımsız, belirtilmemiş veya uygulama tanımlı davranışa bağlı değildir.
doğrudan sağlanan dil bilgisinden kopyalandığı veya
uygulanması ile belgelenmiştir. C kodu, bir işlevi ve ilgili rutinleri tanımlamalıdır.
ve gereksinimleri karşılayan bir ayrıştırma algoritması yürüten bir otomat için makrolar
Algoritmalar.

Dilbilgisinin biçimi ve anlamı GENİŞLETİLMİŞ AÇIKLAMA bölümünde açıklanmıştır.

C kaynak kodu ve başlık dosyası, C için girdi olarak uygun bir biçimde üretilecektir.
derleyici (bkz. c99).

SEÇENEKLER


The yacc yardımcı program, POSIX.1‐2008'in Temel Tanımlar hacmine uygun olacaktır, Bölüm
12.2, Yarar Sözdizimi Kuralları, Kılavuz İlke 9 hariç.

Aşağıdaki seçenekler desteklenecektir:

-b dosya_önek
kullanım dosya_önek yerine y tüm çıktı dosya adları için önek olarak. kod
dosya y.tab.c, başlık dosyası y.tab.h (yaratıldığında -d belirtilir) ve
açıklama dosyası y.çıktı (yaratıldığında -v belirtilir), olarak değiştirilecektir.
dosya_önek.tab.c, dosya_önek.tab.h, ve dosya_önek.çıktı, Sırasıyla.

-d Başlık dosyasını yazın; varsayılan olarak yalnızca kod dosyası yazılır. bu #tanımlamak
ifadeler tarafından atanan belirteç kodlarını ilişkilendirir yacc kullanıcı beyanı ile
jeton isimleri. Bu, aşağıdakilerden başka kaynak dosyalara izin verir: y.tab.c jetona erişmek için
kodlar.

-l Herhangi bir şey içermeyen bir kod dosyası oluşturun #hat yapılar. Bu seçenek
mevcut değil, kod dosyasının mı yoksa başlık dosyasının mı içerdiği belirtilmemiş.
#hat direktifler. Bu, yalnızca dilbilgisi ve ilgili bilgilerden sonra kullanılmalıdır.
eylemler tamamen hata ayıklanır.

-p sym_prefix
kullanım sym_prefix yerine yy tarafından üretilen tüm harici adlar için önek olarak
yacc. Etkilenen adlar işlevleri içerecektir ayrıştırma() Yylex(), ve
yyhata() ve değişkenler yıl, ychar, ve hata ayıklama. (Geri kalanında
Bu bölümde, belirtilen altı sembole varsayılan adları kullanılarak başvurulur.
sadece gösterimsel kolaylık olarak.) Yerel adlar da bundan etkilenebilir. -p
seçenek; Ancak -p seçenek etkilemez #tanımlamak tarafından oluşturulan semboller
yacc.

-t Hata ayıklamanın derlenmesine izin vermek için koşullu derleme yönergelerini değiştirin
kod dosyasındaki kod. Çalışma zamanı hata ayıklama ifadeleri her zaman
kod dosyasıdır, ancak varsayılan olarak koşullu derleme yönergeleri bunların
derleme.

-v Ayrıştırıcının açıklamasını ve çakışma raporunu içeren bir dosya yazın
dilbilgisindeki belirsizlikler tarafından oluşturulur.

İŞLENENLER


Aşağıdaki işlenen gereklidir:

dilbilgisi Talimatları içeren bir dosyanın yol adı, bundan sonra dilbilgisi, Için
hangi bir ayrıştırıcı oluşturulacak. Dilbilgisinin formatı şurada açıklanmıştır:
GENİŞLETİLMİŞ AÇIKLAMA bölümü.

STDIN


Kullanılmamış.

GİRİŞ DOSYALAR


Dosya dilbilgisi GENİŞLETİLMİŞ AÇIKLAMA'da belirtildiği gibi biçimlendirilmiş bir metin dosyası olacaktır.
Bölüm.

ÇEVRE DEĞİŞKENLER


Aşağıdaki ortam değişkenleri, aşağıdakilerin yürütülmesini etkiler: yacc:

DİL Ayarlanmamış veya ayarlanmamış uluslararasılaştırma değişkenleri için varsayılan bir değer sağlayın.
boş. (Bkz. POSIX.1‐2008'in Temel Tanımlar cildi, Bölüm 8.2,
Uluslararasılaşma Değişkenler uluslararasılaşmanın önceliği için
yerel kategorilerin değerlerini belirlemek için kullanılan değişkenler.)

LC_ALL Boş olmayan bir dize değerine ayarlanırsa, diğer tüm değerlerin değerlerini geçersiz kılın
uluslararasılaştırma değişkenleri.

LC_CTYPE Metin verisi bayt dizilerinin yorumlanması için yerel ayarı belirleyin
karakter olarak (örneğin, çoklu bayt karakterlerin aksine tek bayt
argümanlar ve girdi dosyaları).

LC_MESSAGES
biçimini ve içeriğini etkilemek için kullanılması gereken yerel ayarı belirleyin.
standart hataya yazılan teşhis mesajları.

NLSPATH İşleme için mesaj kataloglarının yerini belirleyin. LC_MESSAGES.

The DİL ve LC_* değişkenlerin yürütülmesini etkiler. yacc belirtildiği gibi yarar. bu ana()
tanımlı fonksiyon yacc Kütüphane arayacak:

setlocale(LC_ALL, "")

ve böylece oluşturulan program yacc bunların içeriklerinden de etkilenecektir.
çalışma zamanında değişkenler.

ASENKRON ETKİNLİKLER


Varsayılan.

STDOUT


Kullanılmamış.

STDER


içinde kaydırma/azaltma veya azaltma/azaltma çakışmaları algılanırsa dilbilgisi, yacc bir yazacak
bu çakışmaların standart hatayla belirtilmemiş bir biçimde rapor edilmesi.

Teşhis mesajları için standart hata da kullanılacaktır.

ÇIKTI DOSYALAR


Kod dosyası, başlık dosyası ve açıklama dosyası metin dosyaları olacaktır. Hepsi
aşağıdaki bölümlerde açıklanmıştır.

Kod fileto
Bu dosya, C kaynak kodunu içerecektir. ayrıştırma() işlev. içerecektir
üzerlerinde gerçekleştirilen makro ikameli çeşitli anlamsal eylemler için kod
GENİŞLETİLMİŞ AÇIKLAMA bölümünde açıklanmıştır. Ayrıca, bir kopyasını da içerecektir #tanımlamak
başlık dosyasındaki ifadeler. Eğer bir %Birlik beyanı kullanılır, beyanı için
YYSTYPE da bu dosyaya dahil edilecektir.

üstbilgi fileto
Başlık dosyası şunları içerecektir: #tanımlamak belirteç numaralarını ilişkilendiren ifadeler
jeton isimleri. Bu, kod dosyası dışındaki kaynak dosyalarının belirteç kodlarına erişmesine izin verir.
Eğer bir %Birlik beyanı kullanılır, YYSTYPE beyanı ve bir stajyer doktor YYSTİP yıl
beyanname de bu dosyada yer alır.

Açıklama fileto
Açıklama dosyası, durum makinesinin açıklamasını içeren bir metin dosyası olacaktır.
ayrıştırıcıya karşılık gelen, belirtilmemiş bir biçim kullanarak. Dahili tablolar için sınırlar (bkz.
Sınırları) ayrıca uygulama tanımlı bir şekilde rapor edilecektir. (Bazı uygulamalar
dinamik tahsis tekniklerini kullanabilir ve rapor edilecek belirli bir sınır değeri olmayabilir.)

GENİŞLETİLMİŞ TANIM


The yacc komutu, bir hedef dil için bir dilbilgisi tanımlamak için kullanılan bir dili kabul eder.
tarafından oluşturulan tablolar ve kodlar tarafından ayrıştırılacak yacc. tarafından kabul edilen dil yacc bir şekilde
hedef dil için gramer aşağıda açıklanmıştır. yacc giriş dilinin kendisi.

Girdi dilbilgisi hedef dilin giriş yapısını tanımlayan kuralları içerir ve
ilişkili semantik sağlamak için bu kurallar tanındığında çağrılacak kod
eylem. Yürütülecek kod, C- olması amaçlanan metin gövdeleri olarak görünmelidir.
dil kodu. Bu metin gövdeleri, C dilindeki trigrafları içermeyecektir. C dili
tarafından işlendiğinde, kapanımların doğru bir işlev oluşturduğu varsayılır. yacc çıktısına
Dosyalar. Bu şekilde dahil edilen kod, tanıma sırasında yürütülür.
hedef dil.

Bir gramer verildiğinde, yacc yardımcı program ÇIKIŞ DOSYALARI içinde açıklanan dosyaları oluşturur
Bölüm. Kod dosyası kullanılarak derlenebilir ve bağlanabilir. c99. Eğer beyanname ve
dilbilgisi dosyasının programlar bölümleri tanımlarını içermiyordu ana() Yylex(), ve
yyhata(), derlenmiş çıktı, bunların harici olarak sağlanan sürümleriyle bağlantı kurmayı gerektirir.
fonksiyonlar. Varsayılan sürümleri ana() ve yyhata() içinde sağlanır yacc kütüphane ve
kullanılarak bağlanabilir. -l y işlenen c99. yacc kütüphane arayüzleri gerekmez
varsayılan dışındaki arayüzleri destekleyin yy sembol öneki. Uygulama sağlar
sözcük çözümleyici işlevi, Yylex(); en Lex yardımcı program özel olarak tasarlanmıştır
Böyle bir rutin oluşturun.

Giriş Dil
Başvuru, her şartname dosyasının aşağıdaki üç bölümden oluşmasını sağlamalıdır:
sipariş: bildirimleri, dilbilgisi kurallar, ve programlar, çift ile ayrılmış
karakterler ("%%"). Bildirimler ve programlar bölümleri boş olabilir. ikincisi ise
boş, önceki "%%" kurallar bölümünden ayıran işaret atlanabilir.

Girdi, aşağıda tanımlanan dilbilgisinin yapısını izleyen serbest biçimli metindir.

sözlük Structure of the Dilbilgisi
bu , , ve dışında karakter göz ardı edilecektir.
uygulama, adlarda veya çok karakterli ayrılmış görünmemelerini sağlamalıdır.
semboller. Yorumlar ekte yer alacaktır "/* ... */"ve bir adın olduğu her yerde görünebilir
geçerli.

İsimler rastgele uzunluktadır, harflerden, noktalardan oluşur ("."), alt çizgiler ('_'), Ve
ilk olmayan rakamlar Büyük ve küçük harfler birbirinden farklıdır. Uygun uygulamalar
ile başlayan adları kullanmamalıdır. yy or YY yana yacc ayrıştırıcı bu tür adları kullanır. Çoğu
isimler son çıktıda görünür yaccve bu nedenle uygun olacak şekilde seçilmelidirler.
Kullanılacak C derleyicisi tarafından oluşturulan herhangi bir ek kuralla. Özellikle ortaya çıkıyorlar
in #tanımlamak ifadeleri.

Bir hazır bilgi, tek tırnak içine alınmış tek bir karakterden oluşacaktır. Hepsi
ISO C standardı tarafından karakter sabitleri için desteklenen kaçış dizileri
Tarafından desteklenen yacc.

Sözlüksel çözümleyici ile ilişki aşağıda ayrıntılı olarak tartışılmaktadır.

Uygulama, NUL karakterinin dilbilgisi kurallarında kullanılmamasını veya
değişmez.

Beyannameler Bölüm
Bildirimler bölümü, hedef dili tanımlamak için kullanılan sembolleri tanımlamak için kullanılır.
ve birbirleriyle olan ilişkileri. Özellikle, ek bilgilerin çoğu
Hedef dil için bağlamdan bağımsız dilbilgisindeki belirsizlikleri çözmek için gerekli olan
burada sağlanmıştır.

Genellikle yacc ürettiği sembolik adlar ile bunların arasındaki ilişkiyi atar.
temel sayısal değer. Beyannameler bölümü kontrol etmeyi mümkün kılar.
bu değerlerin atanması

Şu anda açık olan belirteçlerle ilişkili anlamsal bilgileri tutmak da mümkündür.
kullanıcı tanımlı bir C dilinde ayrıştırma yığını sendikasınıneğer birlik üyeleri ise
gramerdeki çeşitli isimlerle ilişkilendirilir. Bildirimler bölümü şunları sağlar:
bu da.

Aşağıdaki ilk bildirimciler grubunun tümü, argüman olarak bir isim listesi alır. Bu liste olabilir
isteğe bağlı olarak, bir C sendika üyesinin adı (a denir) etiket aşağıda) görünen
içinde '<' ve '>'. (Bu kitabın geri kalanının tipografik geleneklerine bir istisna olarak
POSIX.1‐2008 hacmi, bu durumdaetiket> bir metadeğişkeni temsil etmez, ancak
bir sembolü çevreleyen köşeli parantez karakterleri.) etiket belirtir
Bu satırda adı geçen tokenler, referansta bulunulan birlik üyesi ile aynı C tipinde olacaktır.
etiket. Bu, aşağıda daha ayrıntılı olarak ele alınmıştır.

Belirteçleri tanımlamak için kullanılan listeler için, belirli bir belirtecin ilk görünümünün ardından
pozitif bir tam sayı (ondalık basamak dizisi olarak). Bu yapılırsa, temel değer
kendisine sözlüksel amaçlarla atanan sayı o sayı olarak alınacaktır.

Aşağıdaki beyan eder isim jeton olmak:

%jeton [<etiket>] isim [numara] [isim [numara]]...

If etiket mevcutsa, bu satırdaki tüm jetonlar için C tipi, tip olarak ilan edilecektir.
tarafından atıfta bulunulan etiket. Pozitif bir tamsayı ise, numara, bir isim, bu değer
jetona atanır.

Aşağıdaki beyan eder isim bir belirteç olmak ve ona öncelik vermek için:

%ayrıldı [<etiket>] isim [numara] [isim [numara]]...
%sağ [<etiket>] isim [numara] [isim [numara]]...

Bu bölümde, her biri bu sembollerden biriyle başlayan bir veya daha fazla satır görünebilir.
Aynı satırdaki tüm jetonlar aynı öncelik düzeyine ve ilişkilendirilebilirliğe sahiptir; çizgiler
artan öncelik veya bağlayıcı güç sırasına göredir. %ayrıldı olduğunu belirtir
bu satırdaki operatörler ilişkisel bırakılır ve %sağ benzer şekilde hakkı ifade eder
ilişkisel operatörler. Eğer etiket mevcutsa, bir C tipi bildirecektir. isimaçıklandığı gibi
için %jeton.

Aşağıdaki beyan eder isim belirteç olmak ve bunun kullanılamayacağını belirtir
ilişkisel olarak:

%assoc olmayan [<etiket>] isim [numara] [isim [numara]]...

Ayrıştırıcı bu belirtecin ilişkisel kullanımıyla karşılaşırsa bir hata bildirir. Eğer etiket is
için bir C tipi beyan edecektir. isims için açıklandığı gibi %jeton.

Aşağıdakiler, sendika üyesi olduğunu beyan eder isims terminal değildir ve bu nedenle gereklidir
sahip olmak etiket başında alan:

% türü <etiket> isim...

Yalnızca terminal olmayanlarla ilgilendiğinden, bir belirteç numarası atamak veya bir hazır bilgi kullanmak
da yasak. Bu yapı mevcutsa, yacc tip kontrolü yapacak; Eğer bu
yapı mevcut değilse, ayrıştırma yığını yalnızca int yazın.

kullanılan her isim dilbilgisi tarafından tanımlanmadı %jeton, %ayrıldı, %sağya da %assoc olmayan
bildirimin terminal olmayan bir sembolü temsil ettiği varsayılır. bu yacc kamu hizmeti rapor edecek
en az birinin sol tarafında görünmeyen herhangi bir terminal olmayan sembol için bir hata
gramer kuralı.

Bir adın türü, önceliği veya simge numarası belirtildiğinde,
değişti. Bir jetonun ilk beyanı bir jeton numarası atmazsa, yacc -ecek
bir belirteç numarası atayın. Bu atama yapıldıktan sonra jeton numarası değiştirilmeyecektir.
açık atama ile.

Aşağıdaki bildiriciler önceki modeli izlemez.

Aşağıdakiler terminal dışı olduğunu bildirir isim olduğu başlama sembol,
dilbilgisi kuralları tarafından tanımlanan en büyük, en genel yapı:

%Başlat isim

Varsayılan olarak, ilk dilbilgisi kuralının sol tarafıdır; bu varsayılan olabilir
bu beyanla geçersiz kılındı.

Aşağıdaki beyan eder yacc değer yığını, çeşitli değer türlerinin bir birleşimi olacak
İstenen.

%Birlik { vücut of sendikasının (in C)}

Birliğin gövdesi, dengesiz kaşlı ayraç ön işleme belirteçlerini içermeyecektir.

Varsayılan olarak, eylemler (aşağıya bakın) ve sözcük çözümleyici tarafından döndürülen değerler,
türü int. yacc yardımcı program türleri izler ve karşılık gelenleri ekler
sonuçtaki ayrıştırıcının sıkı tip kontrolünü gerçekleştirmek için birlik üye adları.

Alternatif olarak, en az biretiket> yapı kullanılır, birlik bildirilebilir
bir başlık dosyasında (bir #Dahil etmek
içinde inşa etmek %{ ve %}) ve bir typedef temsil edilecek YYSTYPE sembolünü tanımlamak için kullanılır
bu birlik. Etkisi %Birlik YYSTYPE beyanını doğrudan
the yacc giriş.

C dili bildirimleri ve tanımları, ekteki bildirimler bölümünde görünebilir.
aşağıdaki işaretlerle:

%{ ... %}

Bu ifadeler kod dosyasına kopyalanacak ve içinde global bir kapsama sahip olacaktır.
kurallar ve program bölümlerinde kullanılabilir. ifadeler şunları içermeyecektir
"%}" bir yorumun, dize değişmezinin veya çok karakterli sabitin dışında.

Uygulama, beyanlar bölümünün belirteç tarafından sonlandırılmasını sağlayacaktır. %%.

Dilbilgisi kurallar in yacc
Kurallar bölümü, işlev tarafından kabul edilecek bağlamdan bağımsız dilbilgisini tanımlar. yacc
C-dili eylemleri ve ek önceliği oluşturur ve bu kurallarla ilişkilendirir
bilgi. Dilbilgisi aşağıda açıklanmıştır ve resmi bir tanım izler.

Kurallar bölümü, bir veya daha fazla dilbilgisi kuralından oluşur. Bir dilbilgisi kuralı şu şekildedir:

A : Estetik ;

Sembol A terminal olmayan bir adı temsil eder ve Estetik sıfır dizisini temsil eder veya
Daha isims, kelimesi kelimesines, ve anlamsal aksiyondaha sonra isteğe bağlı olarak takip edilebilen s
öncelik kurals. Yalnızca isimler ve değişmezler, oluşumun oluşumuna katılır.
dilbilgisi; anlamsal eylemler ve öncelik kuralları başka şekillerde kullanılır. bu ve
en vardır yacc noktalama. Birkaç ardışık dilbilgisi kuralı varsa
aynı sol taraf, ('|') yeniden yazmaktan kaçınmak için kullanılabilir
Sol taraftaki; bu durumda yalnızca son kuraldan sonra görünür. Vücut
bölüm boş olabilir (veya adlar ve değişmezler boş olabilir), terminal olmayanın olduğunu belirtmek için
sembolü boş dizeyle eşleşir.

The yacc yardımcı program her kurala benzersiz bir numara atar. Dikey çubuğu kullanan kurallar
notasyon ayrı kurallardır. Kurala atanan numara açıklamada görünür
dosyası.

Bir VÜCUT oluşturan unsurlar şunlardır:

isim, kelimesi kelimesine
Bunlar gramer kurallarını oluşturur: isim ya bir simge ya da terminal olmayan;
kelimesi kelimesine kendisi için duruyor (sözlük olarak gerekli olan tırnak işaretleri daha az).

anlamsal aksiyon
Her dilbilgisi kuralıyla kullanıcı, her seferinde gerçekleştirilecek eylemleri ilişkilendirebilir.
kural giriş sürecinde tanınır. ("eylem" kelimesinin
ayrıca ayrıştırıcının eylemlerine de bakın—kaydırma, azaltma vb.)

Bu eylemler, değerleri döndürebilir ve önceki tarafından döndürülen değerleri alabilir.
hareketler. Bu değerler YYSTYPE türündeki nesnelerde tutulur (bkz. %Birlik.)
eylemin sonuç değeri sol el ile ayrıştırma yığınında tutulacaktır.
kuralın tarafı, sağ ellerinin bir parçası olarak diğer indirimler tarafından erişilecek
taraf. kullanaraketiket> beyanlar bölümünde verilen bilgiler,
tarafından oluşturulan kod yacc kesinlikle tip kontrolü yapılabilir ve keyfi içerebilir
bilgi. Ek olarak, sözlüksel analizör aynı türde bilgi sağlayabilir.
istenirse belirteçler için değerler.

Bir eylem, keyfi bir C ifadesidir ve bu nedenle giriş veya çıkış yapabilir, çağrı
alt programlar ve harici değişkenleri değiştirin. Bir eylem, bir veya daha fazla C ifadesidir
kıvırcık parantez içine alınmış '{' ve '}'. ifadeler şunları içermeyecektir
dengesiz küme ayracı ön işleme belirteçleri.

Eylemde belirli sözde değişkenler kullanılabilir. Bunlar erişim için makrolardır
dahili olarak bilinen veri yapılarına yacc.

$$ Eylemin değeri, $$'a atanarak ayarlanabilir. eğer tipi
kontrol etkinleştirilir ve atanacak değerin türü olamaz
belirlenirse, bir teşhis mesajı oluşturulabilir.

$numara Bu, tarafından belirtilen bileşen tarafından döndürülen değeri ifade eder.
simge numara bir kuralın sağ tarafında, soldan sağa okuma;
numara sıfır veya negatif olabilir. Eğer numara sıfır veya negatif, bu
ayrıştırıcı yığınındaki adla ilişkili verileri ifade eder
geçerli kuralın en soldaki sembolünden önce gelir. (Yani, "0 $"
içinde en soldaki addan hemen önceki ada atıfta bulunur.
ayrıştırıcı yığınında bulunacak geçerli kural ve "$-1" ifade eder
sembol onun kaldı.) Eğer numara akımı geçen bir öğeyi ifade eder
kuraldaki nokta veya yığının alt kısmının ötesinde, sonuç
Tanımsız. Tip denetimi etkinse ve yapılacak değerin türü
atanan belirlenemez, bir teşhis mesajı oluşturulabilir.

$<etiket>numara
Bunlar tam olarak karşılık gelen sembollere karşılık gelir. etiket
dahil, ancak katı tip kontrolüne izin verin (ve istenmeyen
tür dönüşümleri). Bunun etkisi, makronun kullanılacak şekilde genişletilmesidir. etiket
YYSTYPE birleşiminden bir öğe seçmek için (kullanarak veriadı.etiketi).
Bu özellikle yararlıdır numara olumlu değil.

$<etiket>$ Bu, referansa atıfta bulunulan sendika üyesinin türünü empoze eder.
by etiket. Bu yapı, bir sola referans olduğunda geçerlidir.
bağlam değeri dilbilgisinde oluşur ve yacc bir yolla
bir tür seçmek için.

Eylemler bir kuralın herhangi bir yerinde olabilir (sadece sonunda değil); bir eylem erişebilir
eylemler tarafından soluna döndürülen değerler ve sırayla döndürdüğü değer
sağındaki eylemlerle erişilir. Bir kuralın ortasında görünen bir eylem
eylemi yeni bir terminal olmayan sembolle değiştirmeye eşdeğer olacaktır ve
sol tarafta bu terminal olmayan sembolle boş bir kural ekleme. bu
yeni kuralla ilişkili anlamsal eylem, orijinal kurala eşdeğer olacaktır.
eylem. Kurallar içinde eylemlerin kullanılması, ortaya çıkmayacak çatışmalara neden olabilir.
aksi halde var.

Varsayılan olarak, bir kuralın değeri, içindeki ilk öğenin değeri olacaktır.
İlk elemanın bir türü yoksa (özellikle bir
değişmez) ve tür denetimi şu şekilde açılır: % türü, bir hata mesajı ile sonuçlanacaktır.

öncelik
Anahtar kelime %prec ile ilişkili öncelik seviyesini değiştirmek için kullanılabilir.
özel gramer kuralı. Bunun örnekleri, tekli ve ikili
operatör aynı sembolik temsile sahiptir, ancak farklı verilmesi gerekir
öncelikler veya belirsiz bir if-else yapısının ele alınması
gerekli. ayrılmış sembol %prec vücudundan hemen sonra görünebilir
dilbilgisi kuralı ve ardından bir belirteç adı veya bir hazır bilgi gelebilir. olacak
dilbilgisi kuralının önceliğinin aşağıdaki belirtecinki haline gelmesine neden olur
isim veya gerçek. Bir bütün olarak kuralın eylemi takip edebilir %prec.

Bir program bölümü takip ederse, uygulama dilbilgisi kurallarının eksiksiz olmasını sağlamalıdır.
tarafından sonlandırıldı %%.

Programlar Bölüm
The programlar bölüm, sözcük çözümleyicisinin tanımını içerebilir Yylex(), Ve herhangi biri
diğer fonksiyonlar; örneğin, dilbilgisi kurallarında belirtilen eylemlerde kullanılanlar. o
programlar bölümünün semantik eylemlerden önce mi yoksa sonra mı geldiği belirtilmemiştir.
çıktı dosyası; bu nedenle, uygulama herhangi bir makro tanımı içeriyorsa ve
Anlamsal eylemlerde koda uygulanması amaçlanan bildirimler, bunları yerleştirecektir.
içinde "%{ ... %}" beyannameler bölümünde.

Giriş Dilbilgisi
Aşağıdaki giriş yacc giriş için bir ayrıştırıcı verir yacc. Bu biçimsel sözdizimi
önceki metin sözdizimi açıklamasına göre önceliklidir.

Sözlüksel yapı daha az kesin olarak tanımlanır; sözlük Structure of the Dilbilgisi tanımlar
çoğu terim. Önceki terimler ile aşağıdaki belirteçler arasındaki yazışma şu şekildedir:
izler.

TANIMLAYICI Bu, kavramına karşılık gelir: isim, daha önce verilmiş. Ayrıca şunları içerir:
daha önce tanımlandığı gibi değişmezler.

C_TANIMLAYICI
Bu bir isimdir ve ayrıca bir isim tarafından takip edildiği bilinmektedir. . A
değişmez bu belirteci veremez.

NUMBER Bir rakam dizisi (negatif olmayan bir ondalık tam sayı).

TİP, SOL, MARK, LCURL, RURL
Bunlar doğrudan karşılık gelir % türü, %ayrıldı, %%, %{, ve %}.

{ ... } Bu, olası dahil edilen C dili kaynak kodunu gösterir. '$'
Daha önce tartışıldığı gibi makrolar.

/* Dilbilgisi için the giriş için yacc. */
/* Basic girişleri. */
/* The takip etme vardır tanınan by the sözlük analizör. */

%token IDENTIFIER /* Tanımlayıcıları ve değişmezleri içerir */
%token C_IDENTIFIER /* tanımlayıcı (ama değişmez değil)
ardından bir :. */
%belirteç SAYISI /* [0-9][0-9]* */

/* Ayrılmış kelimeler : %type=>TYPE %left=>LEFT vb. */

%token SOL SAĞ DOĞRU OLMAYAN TOKEN PREC TÜRÜ BAŞLAT BİRLİĞİ

%token MARK /* %% işareti. */
%token LCURL /* %{ işareti. */
%token RCURL /* %} işareti. */

/* 8 bitlik karakter değişmezleri kendilerini ifade eder; */
/* çok baytlı karakterler için belirteçler tanımlanmalıdır. */

%start özelliği

%%

spec : defs MARK kuralları kuyruğu
;
kuyruk : MARKA
{
/* Bu eylemde, dosyanın geri kalanını ayarlayın. */
}
| /* Boş; ikinci MARK isteğe bağlıdır. */
;
defs : /* Boş. */
| def def
;
tanım: BAŞLANGIÇ TANIMLAYICI
| BİRLİK
{
/* Union tanımını çıktıya kopyala. */
}
| LCURL
{
/* C kodunu çıktı dosyasına kopyala. */
}
RURL
| rword etiketi listesi
;
kelime : TOKEN
| AYRILDI
| SAĞ
| ASOS DIŞI
| TİP
;
etiket : /* Boş: birleşim etiketi kimliği isteğe bağlıdır. */
| '<' TANIMLAYICI '>'
;
liste: nmno
| liste numarası
;
nmno : IDENTIFIER /* Not: % tipi ile literal geçersiz. */
| KİMLİK NUMARASI /* Not: % türü ile geçersiz. */
;

/* Kural bölümü */

kurallar : C_IDENTIFIER rbody prec
| kural kuralı
;
kural : C_IDENTIFIER rbody prec
| '|' rbody prec
;
rbody : /* boş */
| rbody TANIMLAYICI
| vücut hareketi
;
davranmak : '{'
{
/* İşlemi kopyala, $$ çevir, vb. */
}
'}'
;
prec : /* Boş */
| PREC TANIMLAYICI
| PREC TANIMLAYICI kanunu
| ön ';'
;

Çatışmalar
Bir giriş dilbilgisi için üretilen ayrıştırıcı, çakışmaların meydana geldiği durumları içerebilir. bu
dilbilgisi olmadığı için çatışmalar meydana gelir LALR(1). Belirsiz bir dilbilgisi her zaman şunları içerir:
en az bir LALR(1) çatışma. bu yacc yardımcı program, herhangi birini kullanarak tüm çakışmaları çözecektir.
varsayılan kurallar veya kullanıcı tarafından belirlenen öncelik kuralları.

Çatışmalar ya çatışmaları değiştirir/azaltır ya da çatışmaları azaltır/azaltır. Bir kaydırma/azaltma
çatışma, belirli bir durum ve ileriye dönük sembol için hem bir kaydırma eyleminin hem de bir
azaltmak eylemi mümkündür. Azaltma/azaltma çatışması, belirli bir durum için ve
ileriye dönük sembolü, iki farklı kurala göre indirgeme mümkündür.

Aşağıdaki kurallar, bir çakışma meydana geldiğinde hangi eylemlerin gerçekleştirileceğinin nasıl belirleneceğini açıklar. Değil
tüm kaydırma/azaltma çakışmaları bu şekilde başarılı bir şekilde çözülebilir çünkü çakışma
Belirsizlikten başka bir nedenle olabilir, bu nedenle bu tesislerin dikkatsizce kullanılması,
ayrıştırıcı tarafından kabul edilen dilin amaçlanandan çok farklı olması. bu
açıklama dosyası, arızanın nedenini anlamak için yeterli bilgiyi içermelidir.
fikir ayrılığı. Belirsizliğin nedeninin varsayılan veya açık kuralların olması gerektiği durumlarda
çalışan bir ayrıştırıcı üretmek için yeterli.

Beyan edilen öncelikler ve ilişkilendirmeler (bkz. Beyannameler Bölüm) için kullanılır
ayrıştırma çakışmalarını aşağıdaki gibi çözün:

1. Her dilbilgisi kuralıyla bir öncelik ve ilişkilendirme ilişkilendirilir; o
kuralın gövdesindeki son belirtecin veya değişmezin önceliği ve ilişkilendirilebilirliği. Eğer
the %prec anahtar sözcüğü kullanılırsa, bu varsayılanı geçersiz kılar. Bazı gramer kuralları
hem önceliğe hem de ilişkilendirmeye sahiptir.

2. Bir kaydırma/azaltma çakışması varsa ve hem dil bilgisi kuralı hem de giriş simgesi
kendileriyle ilişkili önceliğe ve ilişkilendirilebilirliğe sahipseniz, çatışma çözülür
daha yüksek öncelik ile ilişkili eylem (kaydırma veya azaltma) lehine. Eğer
öncelikler aynıysa, ilişkilendirme kullanılır; sol çağrışım ima eder
azaltmak, doğru çağrışım kaymayı ima eder ve çağrışımsal olmayan bir hata anlamına gelir.
dize ayrıştırılıyor.

3. Kural 2 tarafından çözülemeyen bir kaydırma/azaltma çatışması olduğunda, kaydırma
tamamlamak. Bu şekilde çözülen çakışmalar, içinde açıklanan tanı çıktısında sayılır.
Hata kullanma.

4. Bir azaltma/azaltma çatışması olduğunda, dilbilgisi kuralına göre bir azaltma yapılır.
giriş sırasında daha erken gerçekleşir. Bu şekilde çözülen çatışmalar,
açıklanan tanı çıktısı Hata kullanma.

Öncelik veya çağrışım yoluyla çözülen çatışmalar, kaydırma/azaltmada sayılmayacaktır.
ve tarafından bildirilen çatışmaları azaltmak/azaltmak yacc ya standart hatada ya da
açıklama dosyası

Hata kullanma
jeton hata hata işleme için ayrılacaktır. İsim hata -ebilmek var olmak kullanılmış
dil bilgisi kuralları. Ayrıştırıcının bir sözdizimi hatasından kurtulabileceği yerleri gösterir. bu
varsayılan değeri hata 256 olacaktır. Değeri bir kullanılarak değiştirilebilir. %jeton beyanı.
Sözlüksel çözümleyici, değerini döndürmemelidir. hata.

Ayrıştırıcı, eylemin ilişkili olduğu bir durumdayken bir sözdizimi hatası tespit etmelidir.
ileriye dönük sembolü ile hata. Anlamsal bir eylem, ayrıştırıcının başlatılmasına neden olabilir
YYERROR makrosunu çalıştırarak hata işleme. YYERROR yürütüldüğünde, anlamsal
eylem, denetimi ayrıştırıcıya geri iletir. YYERROR semantik dışında kullanılamaz
eylemler.

Ayrıştırıcı bir sözdizimi hatası algıladığında, normalde yyhata() karakteri ile
dizi "sözdizimi hata" argümanı olarak. Ayrıştırıcı hala çalışıyorsa çağrı yapılmayacaktır.
hata algılandığında önceki bir hatadan kurtarma. Ayrıştırıcı olarak kabul edilir
ayrıştırıcı en az üç taneye geçene kadar önceki bir hatadan kurtarılıyor
son hatanın algılanmasından veya anlamsal bir eylemin yürütülmesinden bu yana normal giriş sembolleri
makro yyerrok. Ayrıştırıcı aramayacak yyhata() YYERROR yürütüldüğünde.

YYRECOVERING makro işlevi, bir sözdizimi hatası algılanırsa ve
ayrıştırıcı henüz ondan tam olarak kurtulmadı. Aksi takdirde sıfır iade edilecektir.

Ayrıştırıcı tarafından bir sözdizimi hatası tespit edildiğinde, ayrıştırıcı önceki bir sözdiziminin olup olmadığını kontrol etmelidir.
hata algılandı. Önceki bir hata algılandıysa ve normal giriş sembolü yoksa
önceki hatanın algılanmasından bu yana kaydırıldıysa, ayrıştırıcı,
ileriye dönük sembolü bir bitiş işaretidir (bkz. arayüzey için the sözlük analizör). Eğer öyleyse,
ayrıştırıcı sıfır olmayan bir değerle dönecektir. Aksi takdirde, ileriye dönük sembolü
atılır ve normal ayrıştırma devam eder.

YYERROR yürütüldüğünde veya ayrıştırıcı bir sözdizimi hatası algıladığında ve önceki bir hata olmadığında
algılandı veya öncekinden bu yana en az bir normal giriş sembolü kaydırıldı
hata algılandı, ayrıştırıcı, ayrıştırma yığını tamamlanana kadar her seferinde bir durum geri dönecektir.
boş veya mevcut durum bir kaymaya izin veriyor hata. Ayrıştırıcı ayrıştırmayı boşaltırsa
yığın, sıfır olmayan bir değerle dönecektir. Aksi halde yer değiştirecek hata ve
sonra normal ayrıştırmaya devam edin. Ayrıştırıcı, hata oluşmadan önce ileriye dönük bir sembol okursa
algılanırsa, ayrıştırma yeniden başlatıldığında bu sembol hala ileriye dönük sembol olacaktır.

Makro yyerrok anlamsal bir eylemde, ayrıştırıcının tamamen tamamlanmış gibi davranmasına neden olur.
önceki hatalardan kurtarıldı. makro yclearin ayrıştırıcının atılmasına neden olur
mevcut ileriye dönük belirteç. Mevcut ileriye dönük jeton henüz okunmadıysa,
yclearin hiçbir etkisi olmayacaktır.

YYACCEPT makrosu, ayrıştırıcının sıfır değeriyle dönmesine neden olacaktır. YYABORT makrosu
ayrıştırıcının sıfır olmayan bir değerle dönmesine neden olur.

arayüzey için the sözlük analizör
The Yylex() işlevi, bir sayı döndüren tamsayı değerli bir işlevdir. simge numara
belirteç okuma türünü temsil eder. Belirteçle ilişkili bir değer varsa
tarafından iade edildi Yylex() (tartışmaya bakınız etiket yukarıda), atanır
dış değişken yıl.

Eğer ayrıştırıcı ve Yylex() bu jeton numaralarına katılmıyorum, güvenilir iletişim
arasında gerçekleşemez. (Tek baytlık karakter) değişmez değerler için, belirteç basitçe
geçerli karakter kümesindeki karakterin sayısal değeri. Diğer belirteçler için sayılar
tarafından seçilebilir yacc, veya kullanıcı tarafından seçilir. Her iki durumda da, #tanımlamak kurmak
C izin vermek için kullanılır Yylex() bu sayıları sembolik olarak döndürmek için. bu #tanımlamak ifadeleri
kod dosyasına ve bu dosya istenirse başlık dosyasına konur. set
izin verilen karakterler yacc bir tanımlayıcıda C. Token tarafından izin verilenden daha büyük
bu karakterleri içerdiği tespit edilen isimler listeye dahil edilmeyecektir. #tanımlamak beyanları.

Belirteç numaraları tarafından seçilirse yacc, değişmezler dışındaki belirteçler atanacaktır
256'dan büyük sayılar, ancak sıra ima edilmese de. Bir belirteç açıkça atanabilir
bir sayı ile bildirimler bölümündeki ilk görünümünü takip ederek bir sayı.
Bu şekilde tanımlanmayan adlar ve değişmez değerler varsayılan tanımlarını korur. Tüm jeton numaraları
atanmak yacc sabit değerler için kullanılan simge numaralarından benzersiz ve farklı olacaktır ve
kullanıcı tarafından atanan belirteçler. Yinelenen belirteç numaraları ayrıştırıcı oluşturmada çakışmalara neden oluyorsa,
yacc bir hata bildirecektir; aksi takdirde, belirteç atamasının olup olmadığı belirtilmemiştir.
kabul edildi veya bir hata bildirildi.

Girişin sonu, adı verilen özel bir simge ile işaretlenir. işaretçi, bir belirteci olan
sıfır veya negatif olan sayı. (Bu değerler başka herhangi bir belirteç için geçersizdir.) Tümü
sözcük analizörleri, sonuna ulaşıldığında belirteç numarası olarak sıfır veya negatif döndürecektir.
onların girdisi. Belirteçler, ancak hariç, bitiş işaretine kadar olan bir yapı oluşturursa,
başlangıç ​​sembolüyle eşleşirse, ayrıştırıcı girişi kabul edecektir. Endmarker şurada görünüyorsa
başka herhangi bir bağlamda, bir hata olarak kabul edilecektir.

Tamamlanıyor the Programı
Ek olarak ayrıştırma() ve Yylex(), fonksiyonlar yyhata() ve ana() zorunludur
eksiksiz bir program yapın. Uygulama sağlayabilir ana() ve yyhata(), ya da bu
rutinler adresinden edinilebilir. yacc kütüphane.

yacc Kütüphane
Aşağıdaki işlevler yalnızca yacc aracılığıyla erişilebilen kütüphane -l y
işlenen c99; bu nedenle uygun bir uygulama ile yeniden tanımlanabilirler:

int ana(geçersiz)
Bu fonksiyon çağıracak ayrıştırma() ve belirtilmemiş bir değerle çıkın. Diğer eylemler
bu fonksiyon içinde belirtilmemiş.

int yyhata(const tank *s)
Bu işlev, NUL ile sonlandırılan argümanı standart hataya yazacak ve ardından
a .

Sırası -l y ve -l l verilen işlenenler c99 önemlidir; uygulama
ya kendi sağlar ana() işlevini yerine getirmek veya sağlamak -l y önce gelir -l l.

Hata ayıklama the Ayrıştırıcı
tarafından oluşturulan ayrıştırıcı yacc isteğe bağlı olarak eklenebilen teşhis olanaklarına sahip olacaktır.
derleme zamanında veya çalışma zamanında etkinleştirilir (derleme zamanında etkinleştirildiyse). bu
çalışma zamanı hata ayıklama kodunun derlenmesi, bir önişlemci olan YYDEBUG'ın kontrolü altındadır.
sembol. YYDEBUG sıfırdan farklı bir değere sahipse hata ayıklama kodu eklenecektir. eğer onun
değer sıfır ise kod dahil edilmeyecektir.

Hata ayıklama kodunun dahil edildiği ayrıştırıcılarda, harici int hata ayıklama olabilir
çalışma zamanında hata ayıklamayı açmak (sıfır olmayan bir değerle) ve kapatmak (sıfır değeri) için kullanılır. bu
başlangıç ​​değeri hata ayıklama sıfır olacaktır.

Ne zaman -t belirtilirse, kod dosyası, YYDEBUG henüz değilse
derleme zamanında tanımlanmış (kullanarak c99 -D YYDEBUG seçeneği, örneğin), YYDEBUG
açıkça 1 olarak ayarlanmalıdır. -t belirtilmemişse, kod dosyası şu şekilde oluşturulacaktır,
YYDEBUG henüz tanımlanmamışsa, açıkça sıfıra ayarlanacaktır.

Hata ayıklama çıktısının biçimi belirtilmemiş ancak en azından yeterli bilgi içeriyor
kaydırmayı ve azaltma eylemlerini ve giriş sembollerini belirlemek için. Ayrıca sağlar
hata kurtarma hakkında bilgi.

Algoritmalar
tarafından oluşturulan ayrıştırıcı yacc bir uygular LALR(1) içinde belgelendiği gibi ayrıştırma algoritması
Edebiyat. Ayrıştırıcının tablo odaklı mı yoksa doğrudan kodlu mu olduğu belirtilmemiştir.

tarafından oluşturulan bir ayrıştırıcı yacc dan asla bir giriş sembolü istemeyecektir. Yylex() bir
hata eylemi dışındaki eylemlerin tek bir kuralla azaltmalar olduğu durum.

Ayrıştırma teorisi literatürü bu kavramları tanımlar.

Sınırları
The yacc yardımcı programın birkaç dahili tablosu olabilir. Bu tablolar için minimum maksimum değerler
aşağıdaki tabloda gösterilmiştir. Bu değerlerin tam anlamı uygulama-
tanımlı. Uygulama, bu değerler arasındaki ve aralarındaki ilişkiyi tanımlamalıdır.
bunlar ve uygulamanın bitmesi durumunda oluşturabileceği herhangi bir hata mesajı
herhangi bir iç yapı için alan. Bir uygulama, bu kaynakların gruplarını birleştirebilir
kullanıcıya sunulan toplam, toplamın altına düşmediği sürece tek bir havuza
Bu bölümde belirtilen boyutlarda.

Tablo: İç Sınırları in yacc

┌─────────────────────────────────────────── ─────┐
│ │ asgari │ │
SınırlamakMaksimumAçıklama
├─────────────────────────────────────────── ─────┤
│{NTERMS} │ 126 │ Belirteç sayısı. │
│{NONTERM} │ 200 │ Terminal olmayanların sayısı. │
│{NPROD} │ 300 │ Kural sayısı. │
│{NSTATES} │ 600 │ Durum sayısı. │
│{MEMSIZE} │ 5200 │ Kuralların uzunluğu. toplam │
│ │ │ uzunluk, adlarda (belirteçler ve │
│ │ │ terminal olmayanlar), tüm │
│ │ │ gramer kuralları. │
│ │ │ için sol taraf sayılır │
│ │ │ her kural, öyle olmasa bile │
│ │ │ açıkça tekrarlanır, │ gibi
│ │ │ belirtilen Dilbilgisi kurallar in
│ │ │ yacc. │
│{ACTSIZE} │ 4000 │ Eylem sayısı. `` Eylemler '' │
│ │ │ burada (ve açıklamasında │
│ │ │ dosyası) ayrıştırıcı eylemlerine bakın │
│ │ │ (kaydırma, küçültme vb.) değil │
│ │ │ │ içinde tanımlanan anlamsal eylemlere
│ │ │ Dilbilgisi kurallar in yacc. │
└─────────────────────────────────────────── ─────┘

EXIT DURUMU


Aşağıdaki çıkış değerleri döndürülecektir:

0 Başarılı tamamlama.

>0 Bir hata oluştu.

SONUÇLARI OF HATALAR


Herhangi bir hatayla karşılaşılırsa, çalıştırma durdurulur ve yacc sıfır olmayan bir durumla çıkar.
Kısmi kod dosyaları ve başlık dosyaları üretilebilir. İçindeki özet bilgiler
açıklama dosyası her zaman oluşturulacaktır, eğer -v bayrak mevcut.

The takip etme bölümler vardır bilgilendirici.

BAŞVURUSU KULLANIM


Tarihsel uygulamalar, adlarda ad çakışmaları yaşar yacc.tmp, yacc.eylemler,
yacc.debug, y.tab.c, y.tab.h, ve y.çıktı birden fazla kopyası varsa yacc koşuyor
bir seferde tek dizin. bu -b Bu sorunun üstesinden gelmek için seçenek eklendi. bu
çoklu izin verme ile ilgili sorun yacc aynı dosyaya yerleştirilecek ayrıştırıcılar
eklenerek adreslenir -p önceden kodlanmış olanı geçersiz kılma seçeneği yy değişken önek.

Açıklaması -p seçenek, minimum işlev kümesini ve değişken adlarını belirtir
birden çok ayrıştırıcı birbirine bağlandığında çatışmaya neden olur. YYSTYPE olması gerekmez
değişti. Bunun yerine, programcı kullanabilir -b farklı ayrıştırıcılar için başlık dosyalarını vermek için
farklı isimler ve ardından dosya ile Yylex() belirli bir ayrıştırıcı için şunları içerebilir:
bu ayrıştırıcı için başlık. gibi isimler yyclearrr değiştirilmelerine gerek yok çünkü onlar
yalnızca eylemlerde kullanılır; bağlantıya sahip değiller. Bir
uygulamanın, aşağıdaki gibi şeyleri uygulamak için dahili olan başka adları vardır.
yyclearrrveya değiştirmek istediği standart dışı özellikleri sağlamak -p.

Genel olarak bir ikili işleçle aynı simge olan tekli işleçlerin,
öncelik ayarlandı. Bu, tarafından işlenir %prec ile ilişkili tavsiye sembolü
bu tekli operatörü tanımlayan belirli dilbilgisi kuralı. (Görmek Dilbilgisi kurallar in yacc.)
Bu operatörü birli operatörler için kullanmak için uygulamalar gerekli değildir, ancak dilbilgisi
Bunu gerektirmeyen nadirdir.

ÖRNEKLER


Erişim yacc kütüphane, kütüphane arama işlenenleri ile elde edilir. c99. kullanmak için
yacc kütüphane ana():

c99 y.tab.c -l y

İkisi de Lex kütüphane ve yacc kitaplık içerir ana(). erişmek için yacc ana():

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

Bu, yacc önce kütüphane aranır, böylece ana() kullanıldı.

Tarihsel yacc kütüphaneler normalde kodlanmış iki basit fonksiyon içerir
uygulama programcısı tarafından Bu işlevler aşağıdaki koda benzer:

#Dahil etmek
int ana(boşluk)
{
stajyer doktor int yparse();

setlocale(LC_ALL, "");

/* Aşağıdaki ayrıştırıcı lex tarafından oluşturulmuşsa,
Uygulamanın LC_CTYPE olduğundan emin olmak için dikkatli olunmalıdır.
ve LC_COLLATE, POSIX yerel ayarına ayarlanır. */
(geçersiz) yyparse();
dönüş (0);
}

#Dahil etmek

int yyerror(const char *msg)
{
(geçersiz) fprintf(stderr, "%s\n", mesaj);
dönüş (0);
}

GEREKÇESİ


içindeki referanslar başvurulan evraklar ayrıştırıcının oluşturulmasında yardımcı olabilir
jeneratör. Başvurulan DeRemer ve Pennello makalesi (çalışmalarıyla birlikte
referanslar), bu hacme uyan ayrıştırıcılar oluşturmak için bir tekniği açıklar.
POSIX.1‐2008. Bu alandaki çalışmalar devam etmektedir, bu nedenle uygulayıcılar danışmalıdır.
Herhangi bir yeni uygulama yapmadan önce mevcut literatür. Orijinal Knuth makalesi,
bu tür ayrıştırıcı için teorik temel, ancak oluşturduğu tablolar pratik olarak
makul gramerler için büyük ve kullanılmamalıdır. `` eşdeğer '' ifadesi
en iyi tabloların olduğundan emin olmak için kasıtlı LALR(1) oluşturulabilir.

Dilbilgisi sınıfı, oluşturmak için gereken algoritmalar arasında bir karışıklık olmuştur.
ayrıştırıcılar ve dilleri ayrıştırmak için gereken algoritmalar. Hepsi makul
dikey. Özellikle, tüm aralığı kabul eden bir ayrıştırıcı üreteci LR(1)
gramerlerin kabul eden bir tablodan daha karmaşık bir tablo oluşturmasına gerek yoktur. SLR(1) (bir
nispeten zayıf LR dilbilgisi sınıfı) olan bir dilbilgisi için SLR(1). Bu tür bir
uygulamanın da durumu tanıması gerekmez; tablo sıkıştırma verebilir SLR(1)
tablo (veya bundan daha küçük bir tablo) dilbilgisinin olduğunu fark etmeden SLR(1).
hızı bir LR(1) herhangi bir sınıf için ayrıştırıcı daha çok tablo gösterimine bağlıdır ve
sıkıştırma (veya doğrudan bir ayrıştırıcı oluşturulduysa kod oluşturma) sınıfa göre
tablo oluşturucunun işlediği dilbilgisi.

Ayrıştırıcı üretecinin hızı, bir şekilde dilbilgisi sınıfına bağlıdır.
kolları. Ancak, LR ayrıştırıcıları oluşturmak için orijinal Knuth makale algoritmaları
yazarı tarafından o sırada pratik olarak yavaş olduğuna karar verildi. Tam LR daha fazla olmasına rağmen
daha karmaşık LALR(1), bilgisayar hızları ve algoritmalar geliştikçe, fark (açısından
kabul edilebilir duvar saati yürütme süresi) daha az önemli hale geliyor.

Potansiyel yazarlar, atıfta bulunulan DeRemer ve Pennello makalesinin
daha önce bahsedilen bir hatayı tanımlar (hesaplamanın aşırı basitleştirilmesi LALR(1)
ileriye dönük kümeler) bazılarında LALR(1) ondan önce gelen algoritma ifadeleri
yayın. Bu makalenin yanı sıra mevcut ilgili makaleyi aramak için zaman ayırmalılar.
iş, özellikle Aho's.

The -b izin vermek için taşınabilir bir yöntem sağlamak için seçenek eklendi yacc üzerinde çalışmak
aynı dizinde birden çok ayrı ayrıştırıcı. Bir dizin birden fazla içeriyorsa
yacc ve her iki dilbilgisi de aynı anda oluşturulur (örneğin, bir
paralel yapmak programı), çakışma sonuçları. Çözüm tarihsel pratik olmasa da,
tarihsel uygulamalarda bilinen bir eksikliği giderir. Karşılık gelen değişiklikler
dosya adlarına atıfta bulunan tüm bölümlere yapılmıştır y.tab.c (şimdi ``kod dosyası''),
y.tab.h (şimdi ``başlık dosyası'') ve y.çıktı (şimdi ``açıklama dosyası'').

için gramer yacc giriş, System V belgelerine dayalıdır. metin açıklaması
orada olduğunu gösterir ';' kuralın sonunda gereklidir. gramer ve
uygulama bunu gerektirmez. (Kullanımı C_TANIMLAYICI azalmasına neden olur
Doğru yer.)

Ayrıca, bu uygulamada, aşağıdaki gibi yapılar %jeton tarafından sonlandırılabilir
, ancak buna dilbilgisi tarafından izin verilmez. gibi anahtar kelimeler %jeton yapabilmek
ayrıca büyük harfle görünür, bu da yine tartışılmaz. Çoğu yerde '%' kullanıldı,
değiştirilebilir ve bazı semboller için alternatif yazımlar vardır
(Örneğin, %AYRILDI olabilir "%<" ya da "\<").

Tarihsel olarak,etiket> dışında herhangi bir karakter içerebilir '>', beyaz boşluk dahil,
uygulama. Ancak, o zamandan beri etiket bir ISO C standart birliği üyesine atıfta bulunmalıdır.
uygulama uyumlu uygulamaların yalnızca ISO C için karakter kümesini desteklemesi gerekir
bu bağlamda standart tanımlayıcılar.

Bazı geçmiş uygulamaların, bir tarafından sonlandırılan eylemleri kabul ettiği bilinmektedir.
dönem. Tarihsel uygulamalar genellikle izin verir '$' isimlerde. Uyumlu bir uygulama
bu davranışlardan herhangi birini desteklemesi gerekmez.

Ne zaman kullanılacağına karar vermek %prec davranışını belirlemenin zorluğunu göstermektedir. yacc.
olduğu durumlar olabilir. dilbilgisi kesin olarak söylemek gerekirse, hatalı değildir ve henüz
yacc açık bir şekilde yorumlayamaz. Dilbilgisindeki belirsizliklerin çözümü,
çoğu durumda, kullanmak gibi ek bilgiler sağlanarak çözülebilir. % türü or
%Birlik beyanlar. Genellikle daha kolaydır ve genellikle almak için daha küçük bir ayrıştırıcı verir.
uygun olduğunda bu alternatif.

Çalışma zamanı hata ayıklama kodu olmadan üretilen bir programın boyutu ve yürütme süresi
tarihsel uygulamalarda genellikle daha küçük ve biraz daha hızlıdır.

Çeşitli geçmiş uygulamalardan gelen istatistik mesajları aşağıdaki türlerini içerir:
bilgi:

n/512 terminaller, n/300 terminal dışı
n/600 gramer kuralları, n/1500 eyalet
n kaydır/azalt, n bildirilen çatışmaları azaltmak/azaltmak
n/350 çalışma seti kullanıldı
Bellek: durumlar, vb. n/15000, ayrıştırıcı n/ 15000
n/600 farklı ileri görüş seti
n ekstra kapatmalar
n vardiya girişleri, n istisnalar
n girişlere git
n varsayılana git tarafından kaydedilen girişler
Kullanılan optimize edici alanı: giriş n/15000, çıktı n/ 15000
n tablo girişleri, n sıfır
Maksimum yayılma: n, Maksimum ofset: n

Açıklama dosyasındaki dahili tabloların raporu, uygulama tanımlı olarak bırakılır
çünkü bu sınırların tüm yönleri aynı zamanda uygulama tanımlıdır. Bazı uygulamalar
dinamik tahsis tekniklerini kullanabilir ve rapor edilecek belirli bir sınır değeri olmayabilir.

Biçimi y.çıktı dosya biçimi belirtilmediği için verilmemiştir.
uygulamaların taşınabilirliğini geliştirdiği görüldü. Listeleme öncelikle insanlara yardım etmeyi amaçlamaktadır.
kullanıcılar ayrıştırıcıyı anlar ve hatalarını ayıklar; kullanımı y.çıktı uyumlu bir uygulama komut dosyasıyla
olağandışı olurdu. Ayrıca, uygulamalar tutarlı çıktı üretmedi ve hayır
popüler format belirgindi. Uygulama tarafından seçilen format, insan-
bir metin dosyası olması şartına ek olarak okunabilir.

Standart hata raporları, nadiren kullanıldıkları için özel olarak açıklanmamıştır.
uygun uygulamalar ve uygulamaları kısıtlamak için hiçbir neden yoktu.

Bazı uygulamalar tanır "={" eşdeğer olarak '{' çünkü tarihsel olarak ortaya çıkıyor
belgeler. Bu yapı, uzun zaman önce modası geçmiş olarak kabul edildi ve belgelendi.
1978, atıfta bulunulan yacc: henüz Başka Derleyici-Derleyici. POSIX.1‐2008'in bu sayısı
eskimiş olarak bırakmayı ve çıkarmayı seçti.

Çok baytlı karakterler sözcük çözümleyici tarafından tanınmalı ve belirteçler olarak döndürülmelidir.
Çok baytlı karakter değişmezleri olarak döndürülmemelidirler. jeton hata kullanılan
hata kurtarma için, geçmiş uygulamada normalde 256 değeri atanır.
Bu nedenle, birçok çok baytlı karakter kümesinde kullanılan simge değeri 256,
kullanıcı tanımlı bir belirtecin değeri olarak kullanılabilir.

GELECEK TARİFİ


Yok.

onworks.net hizmetlerini kullanarak yaccposix'i çevrimiçi kullanın



En yeni Linux ve Windows çevrimiçi programları