InggrisPerancisSpanyol

Ad


favorit OnWorks

yaccposix - Online di Cloud

Jalankan yaccposix di penyedia hosting gratis OnWorks melalui Ubuntu Online, Fedora Online, emulator online Windows, atau emulator online MAC OS

Ini adalah perintah yaccposix yang dapat dijalankan di penyedia hosting gratis OnWorks menggunakan salah satu dari beberapa workstation online gratis kami seperti Ubuntu Online, Fedora Online, Windows online emulator atau MAC OS online emulator

PROGRAM:

NAMA


yacc — kompiler kompiler lain (PENGEMBANGAN)

RINGKASAN


yacc [dltv] [b file_awalan] [p sym_prefix] tatabahasa

DESKRIPSI


Grafik yacc utilitas harus membaca deskripsi tata bahasa bebas konteks di tatabahasa dan tulis C
kode sumber, sesuai dengan standar ISO C, ke file kode, dan opsional header
informasi ke dalam file header, di direktori saat ini. Kode sumber yang dihasilkan harus
tidak bergantung pada perilaku yang tidak ditentukan, tidak ditentukan, atau ditentukan implementasi, kecuali dalam
kasus di mana itu disalin langsung dari tata bahasa yang disediakan, atau dalam kasus yang
didokumentasikan oleh implementasi. Kode C harus mendefinisikan fungsi dan rutinitas terkait
dan makro untuk otomat yang mengeksekusi algoritme penguraian yang memenuhi persyaratan dalam
Algoritma.

Bentuk dan makna tata bahasa dijelaskan di bagian DESKRIPSI LEBIH LANJUT.

Kode sumber C dan file header harus dibuat dalam bentuk yang sesuai sebagai input untuk C
kompiler (lihat c99).

PILIHAN


Grafik yacc utilitas harus sesuai dengan volume Definisi Dasar POSIX.1-2008, Bagian
12.2, Kegunaan Sintaksis Panduan, kecuali untuk Pedoman 9.

Opsi berikut harus didukung:

b file_awalan
penggunaan file_awalan alih-alih y sebagai awalan untuk semua nama file keluaran. Kode
fillet y.tab.c, file header y.tab.h (dibuat ketika d ditentukan), dan
file deskripsi y.keluaran (dibuat ketika v ditentukan), harus diubah menjadi
file_awalan.tab.c, file_awalan.tab.h, dan file_awalan.keluaran, Masing-masing.

d Tulis file header; secara default hanya file kode yang ditulis. NS #menetapkan
pernyataan mengasosiasikan kode token yang diberikan oleh yacc dengan yang dideklarasikan oleh pengguna
nama-nama token. Ini memungkinkan file sumber selain y.tab.c untuk mengakses token
kode.

l Menghasilkan file kode yang tidak mengandung apapun #garis konstruksi. Jika opsi ini
tidak ada, tidak ditentukan apakah file kode atau file header berisi
#garis arahan. Ini hanya boleh digunakan setelah tata bahasa dan yang terkait
tindakan sepenuhnya di-debug.

p sym_prefix
penggunaan sym_prefix alih-alih yy sebagai awalan untuk semua nama eksternal yang dihasilkan oleh
yacc. Nama-nama yang terpengaruh harus mencakup fungsi kamu menguraikan(), yylex(), dan
kesalahan(), dan variabel yylval, yychar, dan yydebug. (Di sisa
bagian ini, enam simbol yang dikutip dirujuk menggunakan nama defaultnya
hanya sebagai kenyamanan notasi.) Nama lokal juga dapat dipengaruhi oleh p
pilihan; namun, p pilihan tidak akan mempengaruhi #menetapkan simbol yang dihasilkan oleh
yacc.

t Ubah arahan kompilasi bersyarat untuk mengizinkan kompilasi debugging
kode dalam file kode. Pernyataan debugging runtime harus selalu terkandung dalam
file kode, tetapi secara default arahan kompilasi bersyarat mencegah
kompilasi.

v Tulis file yang berisi deskripsi parser dan laporan konflik
dihasilkan oleh ambiguitas dalam tata bahasa.

OPERA


Operan berikut diperlukan:

tatabahasa Nama path dari file yang berisi instruksi, selanjutnya disebut tatabahasa, Untuk
parser mana yang akan dibuat. Format tata bahasa dijelaskan dalam
bagian DESKRIPSI DIPERPANJANG.

STDIN


Tidak digunakan.

INPUT FILE


File tatabahasa harus berupa file teks yang diformat seperti yang ditentukan dalam DESKRIPSI DIPERPANJANG
bagian.

LINGKUNGAN VARIABEL


Variabel lingkungan berikut akan mempengaruhi pelaksanaan yacc:

BAHASA Berikan nilai default untuk variabel internasionalisasi yang tidak disetel atau
batal. (Lihat volume Definisi Dasar dari POSIX.1-2008, Bagian 8.2,
Internasionalisasi Variabel untuk didahulukan internasionalisasi
variabel yang digunakan untuk menentukan nilai kategori lokal.)

LC_SEMUA Jika disetel ke nilai string yang tidak kosong, timpa nilai dari yang lainnya
variabel internasionalisasi.

LC_CTYPE Tentukan lokal untuk interpretasi urutan byte data teks
sebagai karakter (misalnya, byte tunggal sebagai lawan dari karakter multi-byte dalam
argumen dan file input).

LC_MESSAGES
Tentukan lokal yang harus digunakan untuk mempengaruhi format dan isi dari
pesan diagnostik yang ditulis ke kesalahan standar.

NLSPATH Tentukan lokasi katalog pesan untuk pemrosesan LC_MESSAGES.

Grafik BAHASA dan LC_* variabel mempengaruhi eksekusi yacc utilitas seperti yang dinyatakan. NS utama()
fungsi yang didefinisikan dalam Yacc Perpustakaan akan memanggil:

setlokal(LC_ALL, "")

dan dengan demikian program yang dihasilkan oleh yacc juga akan terpengaruh oleh konten ini
variabel saat runtime.

tidak sinkron EVENT


Default

STDOUT


Tidak digunakan.

STDERR


Jika pergeseran/pengurangan atau pengurangan/pengurangan konflik terdeteksi di tatabahasa, yacc akan menulis
melaporkan konflik tersebut ke kesalahan standar dalam format yang tidak ditentukan.

Kesalahan standar juga harus digunakan untuk pesan diagnostik.

KELUARAN FILE


File kode, file header, dan file deskripsi harus berupa file teks. Semuanya
dijelaskan dalam bagian berikut.

Kode File
File ini harus berisi kode sumber C untuk kamu menguraikan() fungsi. Ini harus berisi
kode untuk berbagai tindakan semantik dengan substitusi makro yang dilakukan sebagai
dijelaskan di bagian DESKRIPSI TAMBAHAN. Itu juga harus berisi salinan dari #menetapkan
pernyataan dalam file header. Jika sebuah %Persatuan deklarasi digunakan, deklarasi untuk
YYSTYPE juga harus disertakan dalam file ini.

Header File
File header harus berisi: #menetapkan pernyataan yang mengaitkan nomor token dengan
nama-nama token. Ini memungkinkan file sumber selain file kode untuk mengakses kode token.
Jika %Persatuan deklarasi digunakan, deklarasi untuk YYSTYPE dan luar YYSTYPE yylval
deklarasi juga harus disertakan dalam file ini.

Deskripsi Produk File
File deskripsi harus berupa file teks yang berisi deskripsi mesin negara
sesuai dengan parser, menggunakan format yang tidak ditentukan. Batas untuk tabel internal (lihat
Batas) juga harus dilaporkan, dengan cara yang ditentukan oleh implementasi. (Beberapa implementasi
dapat menggunakan teknik alokasi dinamis dan tidak memiliki nilai batas khusus untuk dilaporkan.)

DITERIMA DESKRIPSI


Grafik yacc perintah menerima bahasa yang digunakan untuk mendefinisikan tata bahasa untuk bahasa target
untuk diuraikan oleh tabel dan kode yang dihasilkan oleh yacc. Bahasa yang diterima oleh yacc sebagai
tata bahasa untuk bahasa target dijelaskan di bawah ini menggunakan yacc bahasa masukan itu sendiri.

Input tatabahasa termasuk aturan yang menjelaskan struktur input dari bahasa target dan
kode yang akan dipanggil ketika aturan-aturan ini dikenali untuk menyediakan semantik yang terkait
tindakan. Kode yang akan dieksekusi akan muncul sebagai badan teks yang dimaksudkan untuk menjadi C-
kode bahasa. Badan teks ini tidak boleh berisi trigraf bahasa-C. bahasa C
inklusi dianggap membentuk fungsi yang benar ketika diproses oleh: yacc ke dalam outputnya
file. Kode yang disertakan dengan cara ini harus dijalankan selama pengakuan
bahasa sasaran.

Diberikan sebuah tata bahasa, yacc utilitas menghasilkan file yang dijelaskan dalam FILE OUTPUT
bagian. File kode dapat dikompilasi dan ditautkan menggunakan c99. Jika pernyataan dan
bagian program dari file tata bahasa tidak termasuk definisi dari utama(), yylex(), dan
kesalahan(), keluaran yang dikompilasi memerlukan penautan dengan versi yang disediakan secara eksternal dari itu
fungsi. Versi default dari utama() dan kesalahan() disediakan dalam yacc perpustakaan dan
dapat dihubungkan dengan menggunakan l y operan ke c99. itu yacc antarmuka perpustakaan tidak perlu
mendukung antarmuka dengan selain default yy awalan simbol. Aplikasi ini menyediakan
fungsi penganalisis leksikal, yylex(); NS lex utilitas dirancang khusus untuk
menghasilkan rutinitas seperti itu.

Memasukkan Bahasa
Aplikasi harus memastikan bahwa setiap file spesifikasi terdiri dari tiga bagian dalam:
memesan: deklarasi, tatabahasa aturan, dan program, dipisahkan oleh ganda
karakter ("%%"). Bagian deklarasi dan program boleh kosong. Jika yang terakhir adalah
kosong, sebelumnya "%%" tanda yang memisahkannya dari bagian aturan dapat dihilangkan.

Masukannya adalah teks bentuk bebas yang mengikuti struktur tata bahasa yang ditentukan di bawah ini.

Leksikal Structure of itu Tatabahasa
NS , , dan karakter akan diabaikan, kecuali bahwa
aplikasi harus memastikan bahwa mereka tidak muncul dalam nama atau multi-karakter yang dicadangkan
simbol. Komentar harus dilampirkan di "/* ... */", dan dapat muncul di mana pun sebuah nama berada
sah.

Nama memiliki panjang yang berubah-ubah, terdiri dari huruf, titik ('.'), menggarisbawahi ('_'), Dan
angka bukan awal. Huruf besar dan huruf kecil berbeda. Aplikasi yang sesuai
tidak boleh menggunakan nama yang dimulai dengan yy or YY sejak yacc parser menggunakan nama seperti itu. Kebanyakan
nama-nama muncul di hasil akhir dari yacc, dan dengan demikian mereka harus dipilih untuk menyesuaikan
dengan aturan tambahan yang dibuat oleh kompiler C untuk digunakan. Secara khusus mereka muncul
in #menetapkan pernyataan.

Sebuah literal harus terdiri dari satu karakter yang diapit oleh karakter tanda kutip tunggal. Semua
urutan pelepasan yang didukung untuk konstanta karakter oleh standar ISO C harus:
didukung oleh yacc.

Hubungan dengan penganalisis leksikal dibahas secara rinci di bawah ini.

Aplikasi harus memastikan bahwa karakter NUL tidak digunakan dalam aturan tata bahasa atau
literal.

Deklarasi Bagian
Bagian deklarasi digunakan untuk mendefinisikan simbol yang digunakan untuk mendefinisikan bahasa target
dan hubungan mereka satu sama lain. Secara khusus, banyak informasi tambahan
diperlukan untuk menyelesaikan ambiguitas dalam tata bahasa bebas konteks untuk bahasa target adalah
disediakan disini.

Biasanya yacc menetapkan hubungan antara nama simbolik yang dihasilkannya dan
nilai numerik yang mendasarinya. Bagian deklarasi memungkinkan untuk mengontrol
penugasan nilai-nilai tersebut.

Dimungkinkan juga untuk menyimpan informasi semantik yang terkait dengan token yang saat ini aktif
tumpukan parse dalam bahasa C yang ditentukan pengguna serikat, jika anggota serikat adalah
terkait dengan berbagai nama dalam tata bahasa. Bagian deklarasi menyediakan
ini juga.

Kelompok deklarator pertama di bawah semuanya mengambil daftar nama sebagai argumen. Daftar itu bisa
opsional didahului dengan nama anggota serikat C (disebut a label di bawah) muncul
dalam '<' dan '>'. (Sebagai pengecualian untuk konvensi tipografi dari sisa ini
volume POSIX.1-2008, dalam hal inilabel> tidak mewakili metavariabel, tetapi
karakter kurung sudut literal yang mengelilingi simbol.) Penggunaan label menentukan bahwa
token yang disebutkan pada baris ini harus dari tipe C yang sama dengan anggota serikat pekerja yang dirujuk oleh
label. Ini dibahas secara lebih rinci di bawah ini.

Untuk daftar yang digunakan untuk mendefinisikan token, penampilan pertama dari token yang diberikan dapat diikuti oleh
bilangan bulat positif (sebagai string angka desimal). Jika ini dilakukan, nilai dasarnya
ditugaskan untuk itu untuk tujuan leksikal akan dianggap sebagai nomor itu.

Berikut ini menyatakan nama menjadi tanda:

%token [<label>] nama [jumlah] [nama [jumlah]]...

If label hadir, tipe C untuk semua token pada baris ini akan dinyatakan sebagai tipe
direferensikan oleh label. Jika bilangan bulat positif, jumlah, mengikuti nama, nilai tersebut adalah
ditugaskan ke token.

Berikut ini menyatakan nama untuk menjadi token, dan memberikan prioritas untuk itu:

%kiri [<label>] nama [jumlah] [nama [jumlah]]...
%Baik [<label>] nama [jumlah] [nama [jumlah]]...

Satu atau lebih baris, masing-masing dimulai dengan salah satu simbol ini, dapat muncul di bagian ini.
Semua token pada baris yang sama memiliki tingkat prioritas dan asosiatif yang sama; garis
adalah dalam rangka meningkatkan prioritas atau kekuatan mengikat. %kiri menandakan bahwa
operator pada baris itu dibiarkan asosiatif, dan %Baik sama menunjukkan benar
operator asosiatif. Jika label hadir, itu akan menyatakan tipe C untuk namas seperti yang dijelaskan
untuk %token.

Berikut ini menyatakan nama untuk menjadi token, dan menunjukkan bahwa ini tidak dapat digunakan
secara asosiatif:

%nonassoc [<label>] nama [jumlah] [nama [jumlah]]...

Jika parser menemukan penggunaan asosiatif dari token ini, ia melaporkan kesalahan. Jika label is
hadir, itu akan menyatakan tipe C untuk namas seperti yang dijelaskan untuk %token.

Berikut ini menyatakan bahwa anggota serikat namas adalah non-terminal, dan karenanya diperlukan
untuk memiliki sebuah label bidang pada awalnya:

%Tipe <label> nama...

Karena berurusan dengan non-terminal saja, menetapkan nomor token atau menggunakan literal adalah
juga dilarang. Jika konstruk ini ada, yacc harus melakukan pemeriksaan tipe; jika ini
konstruksi tidak ada, tumpukan parse hanya akan menampung int mengetik.

Setiap nama yang digunakan dalam tatabahasa tidak ditentukan oleh %token, %kiri, %Baik, atau %nonassoc
deklarasi diasumsikan mewakili simbol non-terminal. NS yacc utilitas harus melaporkan
kesalahan untuk simbol non-terminal yang tidak muncul di sisi kiri setidaknya satu
aturan tata bahasa.

Setelah jenis, prioritas, atau nomor token dari sebuah nama ditentukan, nama tersebut tidak boleh
berubah. Jika deklarasi token pertama tidak menetapkan nomor token, yacc akan
menetapkan nomor token. Setelah penugasan ini dibuat, nomor token tidak akan diubah
dengan penugasan eksplisit.

Deklarator berikut tidak mengikuti pola sebelumnya.

Berikut ini mendeklarasikan non-terminal nama untuk menjadi awal simbol, yang mewakili
terbesar, struktur paling umum yang dijelaskan oleh aturan tata bahasa:

%Mulailah nama

Secara default, ini adalah sisi kiri dari aturan tata bahasa pertama; default ini bisa
diganti dengan deklarasi ini.

Berikut ini menyatakan yacc tumpukan nilai menjadi gabungan dari berbagai jenis nilai
diinginkan.

%Persatuan { tubuh of serikat (in C)}

Badan serikat pekerja tidak boleh berisi token pra-pemrosesan kurung kurawal yang tidak seimbang.

Secara default, nilai yang dikembalikan oleh tindakan (lihat di bawah) dan penganalisis leksikal harus
jenis int. itu yacc utilitas melacak jenis, dan itu akan memasukkan yang sesuai
nama anggota serikat pekerja untuk melakukan pemeriksaan tipe yang ketat dari parser yang dihasilkan.

Atau, mengingat bahwa setidaknya satulabel> konstruk digunakan, serikat dapat dideklarasikan
dalam file header (yang harus dimasukkan dalam bagian deklarasi dengan menggunakan a #include
membangun dalam %{ dan %}), dan mengetik digunakan untuk mendefinisikan simbol YYSTYPE untuk mewakili
persatuan ini. Efek dari %Persatuan adalah untuk memberikan deklarasi YYSTYPE langsung dari
itu yacc memasukkan.

Deklarasi dan definisi bahasa C dapat muncul di bagian deklarasi, terlampir
oleh tanda-tanda berikut:

%{ ... %}

Pernyataan-pernyataan ini harus disalin ke dalam file kode, dan memiliki cakupan global di dalamnya sehingga
bahwa mereka dapat digunakan di bagian aturan dan program. Pernyataan tidak boleh mengandung
"%}" di luar komentar, string literal, atau konstanta multi-karakter.

Aplikasi harus memastikan bahwa bagian deklarasi diakhiri oleh token %%.

Tatabahasa Peraturan in yacc
Bagian aturan mendefinisikan tata bahasa bebas konteks untuk diterima oleh fungsi yacc
menghasilkan, dan mengaitkan dengan aturan tersebut tindakan bahasa C dan prioritas tambahan
informasi. Tata bahasa dijelaskan di bawah, dan definisi formal berikut.

Bagian aturan terdiri dari satu atau lebih aturan tata bahasa. Aturan tata bahasa memiliki bentuk:

A : TUBUH ;

Simbol A mewakili nama non-terminal, dan TUBUH mewakili urutan nol atau
lebih namas, harfiahs, dan semantik tindakans yang kemudian dapat diikuti oleh opsional
hak lebih tinggi memerintahS. Hanya nama dan literal yang berpartisipasi dalam pembentukan
tata bahasa; tindakan semantik dan aturan prioritas digunakan dengan cara lain. NS dan
NS adalah yacc tanda baca. Jika ada beberapa aturan tata bahasa yang berurutan dengan
sisi kiri yang sama, ('|') dapat digunakan untuk menghindari penulisan ulang
sisi kiri; dalam hal ini hanya muncul setelah aturan terakhir. Tubuh
bagian dapat kosong (atau kosong dari nama dan literal) untuk menunjukkan bahwa non-terminal
simbol cocok dengan string kosong.

Grafik yacc utilitas memberikan nomor unik untuk setiap aturan. Aturan menggunakan bilah vertikal
notasi adalah aturan yang berbeda. Nomor yang ditetapkan untuk aturan muncul dalam deskripsi
file.

Unsur-unsur yang membentuk BODY adalah:

nama, harfiah
Ini membentuk aturan tata bahasa: nama adalah a token atau bukan terminal;
harfiah berdiri untuk dirinya sendiri (dikurangi tanda kutip yang diperlukan secara leksikal).

semantik tindakan
Dengan setiap aturan tata bahasa, pengguna dapat mengaitkan tindakan yang akan dilakukan setiap kali
aturan diakui dalam proses input. (Perhatikan bahwa kata ``tindakan'' dapat
juga merujuk ke tindakan pengurai—menggeser, mengurangi, dan sebagainya.)

Tindakan ini dapat mengembalikan nilai dan dapat memperoleh nilai yang dikembalikan oleh sebelumnya
tindakan. Nilai-nilai ini disimpan dalam objek tipe YYSTYPE (lihat %Persatuan). Itu
nilai hasil tindakan harus disimpan di tumpukan parse dengan tangan kiri
sisi aturan, untuk diakses oleh pengurangan lain sebagai bagian dari tangan kanan mereka
samping. Dengan menggunakanlabel> informasi yang disediakan di bagian deklarasi, the
kode yang dihasilkan oleh yacc dapat benar-benar diketik dan mengandung sewenang-wenang
informasi. Selain itu, penganalisis leksikal dapat menyediakan jenis yang sama dari
nilai untuk token, jika diinginkan.

Tindakan adalah pernyataan C arbitrer dan dengan demikian dapat melakukan input atau output, panggil
subprogram, dan mengubah variabel eksternal. Suatu tindakan adalah satu atau lebih pernyataan C
diapit kurung kurawal '{' dan '}'. Pernyataan tidak boleh mengandung
token preprocessing kurung kurawal tidak seimbang.

Variabel semu tertentu dapat digunakan dalam aksi. Ini adalah makro untuk akses
ke struktur data yang diketahui secara internal untuk yacc.

$$ Nilai tindakan dapat diatur dengan menetapkannya ke $$. Jika tipe
pemeriksaan diaktifkan dan jenis nilai yang akan ditetapkan tidak dapat
ditentukan, pesan diagnostik dapat dibuat.

$jumlah Ini mengacu pada nilai yang dikembalikan oleh komponen yang ditentukan oleh
token jumlah di sisi kanan aturan, membaca dari kiri ke kanan;
jumlah bisa nol atau negatif. Jika jumlah adalah nol atau negatif, it
mengacu pada data yang terkait dengan nama di tumpukan parser
mendahului simbol paling kiri dari aturan saat ini. (Itu adalah, "$ 0"
mengacu pada nama tepat sebelum nama paling kiri di
aturan saat ini dapat ditemukan di tumpukan parser dan "$−1" ke
simbol untuk -nya kiri.) Jika jumlah mengacu pada elemen yang melewati arus
titik dalam aturan, atau di luar bagian bawah tumpukan, hasilnya adalah
tidak terdefinisi. Jika pemeriksaan tipe diaktifkan dan tipe nilainya menjadi
ditetapkan tidak dapat ditentukan, pesan diagnostik dapat dibuat.

$<label>jumlah
Ini sesuai persis dengan simbol yang sesuai tanpa label
penyertaan, tetapi memungkinkan untuk pemeriksaan jenis yang ketat (dan mencegah yang tidak diinginkan
konversi tipe). Efeknya adalah makro diperluas untuk digunakan label
untuk memilih elemen dari gabungan YYSTYPE (menggunakan namadata.tag).
Ini sangat berguna jika jumlah tidak positif.

$<label>$ Ini membebankan pada referensi jenis anggota serikat yang dirujuk
by label. Konstruksi ini berlaku ketika referensi ke kiri
nilai konteks terjadi dalam tata bahasa, dan memberikan yacc dengan sarana
untuk memilih jenis.

Tindakan dapat terjadi di mana saja dalam aturan (tidak hanya di akhir); suatu tindakan dapat mengakses
nilai yang dikembalikan oleh tindakan di sebelah kirinya, dan pada gilirannya nilai yang dikembalikannya dapat berupa
diakses oleh tindakan di sebelah kanannya. Tindakan yang muncul di tengah-tengah aturan
harus setara dengan mengganti tindakan dengan simbol non-terminal baru dan
menambahkan aturan kosong dengan simbol non-terminal di sisi kiri. NS
tindakan semantik yang terkait dengan aturan baru harus setara dengan aslinya
tindakan. Penggunaan tindakan dalam aturan mungkin menimbulkan konflik yang tidak akan
jika tidak ada.

Secara default, nilai aturan akan menjadi nilai elemen pertama di dalamnya.
Jika elemen pertama tidak memiliki tipe (khususnya dalam kasus a
literal) dan pengecekan tipe diaktifkan oleh %Tipe, akan muncul pesan kesalahan.

hak lebih tinggi
Kata kuncinya %sebelumnya dapat digunakan untuk mengubah tingkat prioritas yang terkait dengan a
aturan tata bahasa tertentu. Contohnya adalah dalam kasus di mana unary dan biner
operator memiliki representasi simbolis yang sama, tetapi perlu diberikan yang berbeda
didahulukan, atau di mana penanganan konstruksi if-else yang ambigu adalah
diperlukan. Simbol yang dicadangkan %sebelumnya dapat muncul segera setelah tubuh
aturan tata bahasa dan dapat diikuti dengan nama token atau literal. Itu harus
menyebabkan prioritas aturan tata bahasa menjadi token berikut
nama atau literal. Tindakan untuk aturan secara keseluruhan dapat mengikuti %sebelumnya.

Jika bagian program mengikuti, aplikasi harus memastikan bahwa aturan tata bahasa adalah
diakhiri oleh %%.

program Bagian
Grafik program bagian dapat mencakup definisi penganalisis leksikal yylex(), dan apa saja
fungsi lainnya; misalnya, yang digunakan dalam tindakan yang ditentukan dalam aturan tata bahasa. Dia
tidak ditentukan apakah bagian program mendahului atau mengikuti tindakan semantik di
berkas keluaran; oleh karena itu, jika aplikasi berisi definisi makro dan
deklarasi yang dimaksudkan untuk diterapkan pada kode dalam tindakan semantik, itu harus menempatkannya
dalam "%{ ... %}" di bagian deklarasi.

Memasukkan Tatabahasa
Masukan berikut untuk yacc menghasilkan parser untuk input ke yacc. Sintaks formal ini
diutamakan daripada deskripsi sintaks teks sebelumnya.

Struktur leksikal didefinisikan dengan kurang tepat; Leksikal Structure of itu Tatabahasa mendefinisikan
kebanyakan istilah. Korespondensi antara istilah sebelumnya dan token di bawah ini adalah sebagai
mengikuti.

IDENTIFIKASI Hal ini sesuai dengan konsep nama, diberikan sebelumnya. Ini juga termasuk
literal seperti yang didefinisikan sebelumnya.

C_IDENTIFIER
Ini adalah nama, dan selain itu diketahui diikuti oleh a . A
literal tidak dapat menghasilkan token ini.

NOMOR Serangkaian angka (bilangan bulat desimal non-negatif).

JENIS, KIRI, MENANDAI, LCURL, RCURL
Ini berhubungan langsung dengan %Tipe, %kiri, %%, %{, dan %}.

{ ... } Ini menunjukkan kode sumber bahasa C, dengan kemungkinan penyertaan '$'
makro seperti yang telah dibahas sebelumnya.

/* Tatabahasa untuk itu memasukkan untuk yacc. */
/* Dasar entri. */
/* Grafik berikut adalah diakui by itu leksikal penganalisis. */

%token IDENTIFIER /* Termasuk pengidentifikasi dan literal */
%token C_IDENTIFIER /* pengenal (tetapi tidak literal)
diikuti oleh :. */
%token NOMOR /* [0-9][0-9]* */

/* Kata-kata yang dicadangkan : %type=>TYPE %left=>LEFT, dan seterusnya */

%token KIRI KANAN NONASSOC TOKEN PREC TYPE MULAI UNION

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

/* Karakter literal 8-bit berdiri sendiri; */
/* token harus didefinisikan untuk karakter multi-byte. */

% mulai spesifikasi

%%

spec : defs aturan MARK ekor
;
ekor : MARK
{
/* Dalam tindakan ini, atur sisa file. */
}
| /* Kosong; MARK kedua adalah opsional. */
;
defs : /* Kosong. */
| def def
;
def : MULAI IDENTIFIER
| PERSATUAN
{
/* Salin definisi serikat ke output. */
}
| LCURL
{
/* Salin kode C ke file keluaran. */
}
RCURL
| daftar tag rword
;
kata : TOKEN
| KIRI
| BAIK
| NONASSOC
| TIPE
;
tag : /* Kosong: ID tag gabungan opsional. */
| '<' PENGIDENTIFIKASI '>'
;
daftar: nmno
| daftar nmno
;
nmno : IDENTIFIER /* Catatan: literal tidak valid dengan tipe %. */
| NOMOR IDENTIFIER /* Catatan: tidak valid dengan tipe %. */
;

/* Bagian aturan */

aturan : C_IDENTIFIER rbody prec
| aturan aturan
;
aturan : C_IDENTIFIER rbody prec
| '|' rbody prec
;
badan : /* kosong */
| IDENTIFIER tubuh
| tindakan tubuh
;
bertindak : '{'
{
/* Salin tindakan, terjemahkan $$, dan seterusnya. */
}
'}'
;
prec : /* Kosong */
| IDENTIFIKASI PREC
| Tindakan PREC IDENTIFIER
| sebelum ';'
;

Konflik
Parser yang dihasilkan untuk tata bahasa input mungkin berisi status di mana konflik terjadi. NS
konflik terjadi karena tata bahasa tidak LALR(1). Tata bahasa yang ambigu selalu mengandung
setidaknya satu LALR(1) konflik. NS yacc utilitas akan menyelesaikan semua konflik, baik menggunakan
aturan default atau aturan prioritas yang ditentukan pengguna.

Konflik dapat berupa pergeseran/pengurangan konflik atau pengurangan/pengurangan konflik. Pergeseran/pengurangan
konflik adalah di mana, untuk keadaan tertentu dan simbol pandangan ke depan, baik aksi pergeseran maupun a
mengurangi tindakan yang mungkin. Mengurangi/mengurangi konflik adalah di mana, untuk keadaan tertentu dan
simbol lookahead, pengurangan dengan dua aturan yang berbeda dimungkinkan.

Aturan di bawah ini menjelaskan cara menentukan tindakan apa yang harus diambil ketika konflik terjadi. Bukan
semua pergeseran/pengurangan konflik dapat berhasil diselesaikan dengan cara ini karena konflik dapat
disebabkan oleh sesuatu selain ambiguitas, sehingga penggunaan fasilitas ini secara tidak hati-hati dapat menyebabkan
bahasa yang diterima oleh parser menjadi jauh berbeda dari yang dimaksudkan. NS
file deskripsi harus berisi informasi yang cukup untuk memahami penyebab
konflik. Di mana ambiguitas adalah alasan mengapa aturan default atau eksplisit seharusnya
memadai untuk menghasilkan parser yang berfungsi.

Prioritas dan asosiatif yang dinyatakan (lihat Deklarasi Bagian) digunakan untuk
menyelesaikan parsing konflik sebagai berikut:

1. Prioritas dan asosiatif dikaitkan dengan setiap aturan tata bahasa; ini adalah
didahulukan dan asosiatif dari token terakhir atau literal dalam tubuh aturan. Jika
itu %sebelumnya kata kunci digunakan, itu menimpa default ini. Beberapa aturan tata bahasa mungkin tidak
memiliki prioritas dan asosiatif.

2. Jika ada pergeseran/pengurangan konflik, dan kedua aturan tata bahasa dan simbol input
memiliki prioritas dan asosiatif yang terkait dengannya, maka konflik diselesaikan
mendukung tindakan (menggeser atau mengurangi) yang terkait dengan prioritas yang lebih tinggi. jika
presedensinya sama, maka associativity digunakan; asosiatif kiri menyiratkan
mengurangi, asosiatif kanan menyiratkan pergeseran, dan non-asosiatif menyiratkan kesalahan dalam
string yang sedang diurai.

3. Apabila terjadi pergeseran/pengurangan konflik yang tidak dapat diselesaikan dengan aturan 2, maka pergeserannya adalah
selesai. Konflik yang diselesaikan dengan cara ini dihitung dalam keluaran diagnostik yang dijelaskan dalam
error Penanganan.

4. Saat terjadi konflik reduksi/reduksi, reduksi dilakukan dengan kaidah tata bahasa yaitu
terjadi lebih awal dalam urutan input. Konflik yang diselesaikan dengan cara ini dihitung dalam
keluaran diagnostik dijelaskan dalam error Penanganan.

Konflik yang diselesaikan dengan prioritas atau asosiatif tidak akan dihitung dalam shift/reduce
dan mengurangi/mengurangi konflik yang dilaporkan oleh yacc baik pada kesalahan standar atau di
berkas deskripsi.

error Penanganan
Tokennya kesalahan akan dicadangkan untuk penanganan kesalahan. Nama kesalahan dapat digunakan di
peraturan tata bahasa. Ini menunjukkan tempat di mana parser dapat pulih dari kesalahan sintaks. NS
nilai default dari kesalahan harus 256. Nilainya dapat diubah menggunakan a %token pernyataan.
Penganalisis leksikal tidak boleh mengembalikan nilai kesalahan.

Pengurai akan mendeteksi kesalahan sintaks ketika berada dalam keadaan di mana tindakan terkait
dengan simbol lookahead adalah kesalahan. Tindakan semantik dapat menyebabkan pengurai dimulai
penanganan kesalahan dengan menjalankan makro YYERROR. Ketika YYERROR dieksekusi, semantik
tindakan melewati kontrol kembali ke parser. YYERROR tidak dapat digunakan di luar semantik
tindakan.

Ketika parser mendeteksi kesalahan sintaks, biasanya ia memanggil kesalahan() dengan karakter
tali "sintaksis kesalahan" sebagai argumennya. Panggilan tidak akan dilakukan jika pengurai diam
memulihkan dari kesalahan sebelumnya ketika kesalahan terdeteksi. Pengurai dianggap
pulih dari kesalahan sebelumnya hingga pengurai telah bergeser setidaknya tiga
simbol input normal sejak kesalahan terakhir terdeteksi atau tindakan semantik telah dijalankan
makro kamu. Pengurai tidak akan memanggil kesalahan() ketika YYERROR dieksekusi.

Fungsi makro YYRECOVERING akan mengembalikan 1 jika kesalahan sintaks telah terdeteksi dan
parser belum sepenuhnya pulih darinya. Jika tidak, nol akan dikembalikan.

Ketika kesalahan sintaks terdeteksi oleh pengurai, pengurai akan memeriksa apakah sintaks sebelumnya
kesalahan telah terdeteksi. Jika kesalahan sebelumnya terdeteksi, dan jika tidak ada simbol input normal
telah digeser sejak kesalahan sebelumnya terdeteksi, pengurai memeriksa apakah
simbol lookahead adalah penanda akhir (lihat Antarmuka untuk itu Leksikal Analyzer). Jika ya,
parser akan kembali dengan nilai bukan nol. Jika tidak, simbol lookahead adalah
dibuang dan penguraian normal akan dilanjutkan.

Ketika YYERROR dijalankan atau ketika parser mendeteksi kesalahan sintaks dan tidak ada kesalahan sebelumnya
telah terdeteksi, atau setidaknya satu simbol input normal telah digeser sejak sebelumnya
kesalahan terdeteksi, parser akan memunculkan kembali satu status pada satu waktu hingga tumpukan parse adalah
kosong atau keadaan saat ini memungkinkan pergeseran kesalahan. Jika parser mengosongkan parse
stack, itu akan kembali dengan nilai bukan nol. Kalau tidak, itu akan bergeser kesalahan dan
kemudian lanjutkan penguraian normal. Jika parser membaca simbol lookahead sebelum kesalahan itu
terdeteksi, simbol itu akan tetap menjadi simbol lookahead saat parsing dilanjutkan.

makro kamu dalam tindakan semantik akan menyebabkan pengurai bertindak seolah-olah telah sepenuhnya
pulih dari kesalahan sebelumnya. makro kamu jelasin akan menyebabkan parser membuang
token lookahead saat ini. Jika token lookahead saat ini belum dibaca,
kamu jelasin tidak akan berpengaruh.

YYACCEPT makro akan menyebabkan parser kembali dengan nilai nol. makro YYABORT
akan menyebabkan parser kembali dengan nilai bukan nol.

Antarmuka untuk itu Leksikal Analyzer
Grafik yylex() fungsi adalah fungsi bernilai integer yang mengembalikan a token jumlah
mewakili jenis token yang dibaca. Jika ada nilai yang terkait dengan token
dikembalikan oleh yylex() (lihat pembahasan tentang label di atas), itu akan ditugaskan ke
variabel eksternal yylval.

Jika pengurai dan yylex() tidak setuju dengan nomor token ini, komunikasi yang andal
antara mereka tidak dapat terjadi. Untuk literal (karakter byte tunggal), tokennya hanyalah
nilai numerik karakter dalam set karakter saat ini. Nomor untuk token lainnya
dapat dipilih oleh yacc, atau dipilih oleh pengguna. Dalam kedua kasus, #menetapkan membangun
dari C digunakan untuk memungkinkan yylex() untuk mengembalikan angka-angka ini secara simbolis. NS #menetapkan Laporan
dimasukkan ke dalam file kode, dan file header jika file itu diminta. Sekumpulan dari
karakter yang diizinkan oleh yacc dalam pengidentifikasi lebih besar dari yang diizinkan oleh C. Token
nama yang ditemukan mengandung karakter tersebut tidak boleh dimasukkan dalam #menetapkan deklarasi.

Jika nomor token dipilih oleh yacc, token selain literal akan ditetapkan
angka yang lebih besar dari 256, meskipun tidak ada urutan yang tersirat. Token dapat diberikan secara eksplisit
nomor dengan mengikuti penampilan pertamanya di bagian deklarasi dengan nomor.
Nama dan literal yang tidak didefinisikan dengan cara ini mempertahankan definisi defaultnya. Semua nomor token
ditanda tangani oleh yacc harus unik dan berbeda dari nomor token yang digunakan untuk literal dan
token yang ditetapkan pengguna. Jika nomor token duplikat menyebabkan konflik dalam pembuatan parser,
yacc harus melaporkan kesalahan; jika tidak, tidak ditentukan apakah penugasan token adalah
diterima atau kesalahan dilaporkan.

Akhir input ditandai dengan token khusus yang disebut penanda akhir, yang memiliki token
bilangan yang nol atau negatif. (Nilai ini tidak valid untuk token lainnya.) Semua
penganalisis leksikal akan mengembalikan nol atau negatif sebagai nomor token setelah mencapai akhir
masukan mereka. Jika token hingga, tetapi tidak termasuk, penanda akhir membentuk struktur yang
cocok dengan simbol awal, parser akan menerima input. Jika penanda akhir terlihat di
konteks lain, itu akan dianggap sebagai kesalahan.

Menyelesaikan itu program
Selain kamu menguraikan() dan yylex(), fungsi kesalahan() dan utama() diharuskan untuk
membuat program yang lengkap. Aplikasi dapat menyediakan utama() dan kesalahan(), atau itu
rutin dapat diperoleh dari yacc Perpustakaan.

Yacc Perpustakaan
Fungsi berikut hanya akan muncul di: yacc perpustakaan yang dapat diakses melalui l y
operan ke c99; karena itu mereka dapat didefinisikan ulang oleh aplikasi yang sesuai:

int utama(membatalkan)
Fungsi ini akan memanggil kamu menguraikan() dan keluar dengan nilai yang tidak ditentukan. Aksi lainnya
dalam fungsi ini tidak ditentukan.

int kesalahan(const tangki *s)
Fungsi ini akan menulis argumen yang diakhiri NUL ke kesalahan standar, diikuti oleh
A .

Urutan file l y dan l l operan yang diberikan kepada c99 signifikan; aplikasi harus
baik menyediakan sendiri utama() berfungsi atau memastikan bahwa l y mendahului l l.

Debugging itu parser
Pengurai yang dihasilkan oleh yacc harus memiliki fasilitas diagnostik di dalamnya yang dapat opsional
diaktifkan pada waktu kompilasi atau saat runtime (jika diaktifkan pada waktu kompilasi). NS
kompilasi kode debug runtime berada di bawah kendali YYDEBUG, sebuah praprosesor
simbol. Jika YYDEBUG memiliki nilai bukan nol, kode debug harus disertakan. Jika itu
nilainya nol, kode tidak boleh disertakan.

Di parser di mana kode debug telah disertakan, eksternal int yydebug dapat
digunakan untuk mengaktifkan debugging (dengan nilai bukan nol) dan menonaktifkan (nilai nol) saat runtime. NS
nilai awal yydebug akan menjadi nol.

Ketika t ditentukan, file kode harus dibuat sedemikian rupa sehingga, jika YYDEBUG belum ada
didefinisikan pada waktu kompilasi (menggunakan c99 D opsi YYDEBUG, misalnya), YYDEBUG harus
diatur secara eksplisit ke 1. Kapan t tidak ditentukan, file kode harus dibuat sedemikian rupa sehingga,
jika YYDEBUG belum ditentukan, itu harus ditetapkan secara eksplisit ke nol.

Format output debugging tidak ditentukan tetapi mencakup setidaknya informasi yang cukup
untuk menentukan pergeseran dan pengurangan tindakan, dan simbol input. Ini juga menyediakan
informasi tentang pemulihan kesalahan.

Algoritma
Pengurai dibangun oleh yacc mengimplementasikan LALR(1) algoritma penguraian seperti yang didokumentasikan dalam
literatur. Tidak ditentukan apakah parser digerakkan oleh tabel atau dikodekan secara langsung.

Pengurai yang dihasilkan oleh yacc tidak akan pernah meminta simbol input dari yylex() saat berada di
menyatakan di mana satu-satunya tindakan selain tindakan kesalahan adalah pengurangan oleh satu aturan.

Literatur teori parsing mendefinisikan konsep-konsep ini.

Batas
Grafik yacc utilitas mungkin memiliki beberapa tabel internal. Maksimum minimum untuk tabel ini
ditunjukkan dalam tabel berikut. Arti sebenarnya dari nilai-nilai ini adalah implementasi-
didefinisikan. Implementasi harus menentukan hubungan antara nilai-nilai ini dan antara
mereka dan pesan kesalahan apa pun yang mungkin dihasilkan oleh implementasi jika kehabisan
ruang untuk setiap struktur internal. Implementasi dapat menggabungkan kelompok sumber daya ini
ke dalam satu kumpulan selama total yang tersedia untuk pengguna tidak jatuh di bawah jumlah
dari ukuran yang ditentukan oleh bagian ini.

Tabel: Intern Batas in yacc

┌───────────┬─────────┬─────────────────────────── ─────┐
│ │. Minimum │ │.
batasMaksimumDeskripsi Produk
├───────────┼─────────┼─────────────────────────── ─────┤
{NTERMS} 126 Jumlah token. │
{NONTERM} 200 Jumlah non-terminal. │
{NPROD} 300 Jumlah aturan. │
{NSTATES} 600 Jumlah negara bagian. │
{MEMSIZE} 5200 Panjang aturan. Jumlahnya
│ panjang, dalam nama (token dan
│ │ non-terminal), dari semua
aturan tata bahasa. The
sisi kiri dihitung untuk
│ setiap aturan, meskipun bukan
secara eksplisit diulang, seperti
ditentukan dalam Tatabahasa Peraturan in
│ │ │. yacc. │.
{UKURAN TINDAKAN} 4000 Jumlah tindakan. ``Tindakan''
│ di sini (dan dalam deskripsi
file) merujuk ke tindakan parser
(geser, kurangi, dan sebagainya) bukan
ke tindakan semantik yang didefinisikan dalam
│ │ │. Tatabahasa Peraturan in yacc. │.
└───────────┴─────────┴─────────────────────────── ─────┘

EXIT STATUS


Nilai keluar berikut harus dikembalikan:

0 Berhasil menyelesaikan.

>0 Terjadi kesalahan.

KONSEKUENSI OF GALAT


Jika ada kesalahan yang ditemukan, proses dibatalkan dan yacc keluar dengan status bukan nol.
File kode parsial dan file header dapat diproduksi. Informasi ringkasan dalam
file deskripsi harus selalu diproduksi jika: v bendera hadir.

Grafik berikut bagian adalah informatif.

APLIKASI PENGGUNAAN


Implementasi historis mengalami konflik nama pada nama yacc.tmp, yacc.acts,
yacc.debug, y.tab.c, y.tab.h, dan y.keluaran jika lebih dari satu salinan yacc sedang berjalan di
direktori tunggal pada satu waktu. NS b pilihan ditambahkan untuk mengatasi masalah ini. NS
masalah terkait memungkinkan beberapa yacc parser untuk ditempatkan di file yang sama adalah
diatasi dengan menambahkan p opsi untuk menimpa yang sebelumnya dikodekan dengan keras yy awalan variabel.

Deskripsi dari p opsi menentukan set minimal fungsi dan nama variabel
yang menyebabkan konflik ketika beberapa parser dihubungkan bersama. YYSTYPE tidak perlu
berubah. Sebagai gantinya, programmer dapat menggunakan b untuk memberikan file header untuk parser yang berbeda
nama yang berbeda, dan kemudian file dengan yylex() untuk parser tertentu dapat menyertakan:
header untuk parser itu. Nama-nama seperti yyclearrr tidak perlu diubah karena mereka
hanya digunakan dalam tindakan; mereka tidak memiliki hubungan. Ada kemungkinan bahwa
implementasi memiliki nama lain, baik yang internal untuk mengimplementasikan hal-hal seperti
yyclearrr, atau menyediakan fitur non-standar yang ingin diubahnya p.

Operator unary yang tokennya sama dengan operator biner pada umumnya membutuhkan
prioritas disesuaikan. Ini ditangani oleh %sebelumnya simbol nasihat yang terkait dengan
aturan tata bahasa tertentu yang mendefinisikan operator unary itu. (Lihat Tatabahasa Peraturan in yacc.)
Aplikasi tidak diperlukan untuk menggunakan operator ini untuk operator unary, tetapi tata bahasa
yang tidak membutuhkannya jarang terjadi.

CONTOH


Akses ke yacc perpustakaan diperoleh dengan operan pencarian perpustakaan untuk c99. Untuk menggunakan
yacc perpustakaan utama():

c99 y.tab.c l y

Keduanya lex perpustakaan dan yacc perpustakaan berisi utama(). Untuk mengakses yacc utama():

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

Ini memastikan bahwa yacc perpustakaan dicari terlebih dahulu, sehingga utama() digunakan.

Sejarah yacc perpustakaan telah berisi dua fungsi sederhana yang biasanya dikodekan
oleh pemrogram aplikasi. Fungsi-fungsi ini mirip dengan kode berikut:

#include
int utama (batal)
{
luar int yyparse();

setlocale(LC_ALL, "");

/* Jika parser berikut dibuat oleh lex, maka
aplikasi harus berhati-hati untuk memastikan bahwa LC_CTYPE
dan LC_COLLATE disetel ke lokal POSIX. */
(batal) yyparse();
kembali (0);
}

#termasuk

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

ALASAN


Referensi di Direferensikan Documents mungkin membantu dalam membangun parser
generator. Artikel DeRemer dan Pennello yang dirujuk (bersama dengan karya-karyanya
referensi) menjelaskan teknik untuk menghasilkan parser yang sesuai dengan volume ini
POSIX.1-2008. Pekerjaan di bidang ini terus dilakukan, jadi pelaksana harus berkonsultasi
literatur saat ini sebelum melakukan implementasi baru. Artikel asli Knuth adalah
dasar teoretis untuk pengurai semacam ini, tetapi tabel yang dihasilkannya tidak praktis
besar untuk tata bahasa yang masuk akal dan tidak boleh digunakan. Kata-kata ``setara dengan'' adalah
disengaja untuk memastikan bahwa tabel terbaik yang LALR(1) dapat dihasilkan.

Ada kebingungan antara kelas tata bahasa, algoritma yang dibutuhkan untuk menghasilkan
parser, dan algoritme yang diperlukan untuk mengurai bahasa. Mereka semua masuk akal
ortogonal. Secara khusus, generator parser yang menerima berbagai macam LR(1)
tata bahasa tidak perlu menghasilkan tabel yang lebih kompleks daripada tabel yang menerima SLR(1) (sebuah
kelas tata bahasa LR yang relatif lemah) untuk tata bahasa yang kebetulan SLR(1). Seperti
implementasi juga tidak perlu mengenali kasusnya; kompresi tabel dapat menghasilkan SLR(1)
tabel (atau bahkan lebih kecil dari itu) tanpa menyadari bahwa tata bahasanya adalah SLR(1). Itu
kecepatan suatu LR(1) parser untuk setiap kelas lebih bergantung pada representasi tabel dan
kompresi (atau pembuatan kode jika parser langsung dibuat) daripada di atas kelas
tata bahasa yang ditangani oleh generator tabel.

Kecepatan generator parser agak tergantung pada kelas tata bahasanya
menangani. Namun, algoritme artikel Knuth asli untuk membuat parser LR adalah
dinilai oleh penulisnya sangat lambat pada saat itu. Meskipun LR penuh lebih banyak
kompleks daripada LALR(1), seiring dengan peningkatan kecepatan dan algoritme komputer, perbedaannya (dalam hal
waktu eksekusi jam dinding yang dapat diterima) menjadi kurang signifikan.

Penulis potensial diperingatkan bahwa artikel DeRemer dan Pennello yang direferensikan
dikutip sebelumnya mengidentifikasi bug (penyederhanaan berlebihan dari perhitungan LALR(1)
lookahead set) di beberapa LALR(1) pernyataan algoritma yang mendahuluinya
publikasi. Mereka harus meluangkan waktu untuk mencari makalah itu, serta yang relevan saat ini
bekerja, terutama Aho.

Grafik b opsi ditambahkan untuk menyediakan metode portabel untuk mengizinkan yacc untuk dikerjakan
beberapa parser terpisah dalam direktori yang sama. Jika direktori berisi lebih dari satu
yacc tata bahasa, dan kedua tata bahasa dibangun pada saat yang sama (oleh, misalnya, a
paralel membuat program), hasil konflik. Meskipun solusinya bukanlah praktik historis,
itu mengoreksi kekurangan yang diketahui dalam implementasi historis. Perubahan yang sesuai adalah
dibuat untuk semua bagian yang mereferensikan nama file y.tab.c (sekarang ``file kode''),
y.tab.h (sekarang ``file header''), dan y.keluaran (sekarang ``file deskripsi'').

Tata bahasa untuk yacc input didasarkan pada dokumentasi Sistem V. Deskripsi tekstual
menunjukkan di sana bahwa ';' diperlukan di akhir aturan. Tata bahasa dan
implementasi tidak memerlukan ini. (Penggunaan C_IDENTIFIER menyebabkan pengurangan terjadi pada
tempat yang tepat.)

Juga, dalam implementasi itu, konstruksi seperti %token dapat diakhiri dengan
, tapi ini tidak diizinkan oleh tata bahasa. Kata kunci seperti %token bisa
juga muncul dalam huruf besar, yang sekali lagi tidak dibahas. Di sebagian besar tempat di mana '%' digunakan,
dapat diganti, dan ada ejaan alternatif untuk beberapa simbol
(sebagai contoh, %KIRI dapat "%<" atau bahkan "\<").

Secara historis,label> boleh berisi karakter apa saja kecuali '>', termasuk spasi, di
penerapan. Namun, sejak label harus merujuk anggota serikat standar ISO C, dalam
praktik implementasi yang sesuai hanya perlu mendukung rangkaian karakter untuk ISO C
pengenal standar dalam konteks ini.

Beberapa implementasi historis diketahui menerima tindakan yang dihentikan oleh a
Titik. Implementasi historis sering memungkinkan '$' dalam nama. Implementasi yang sesuai
tidak perlu mendukung salah satu dari perilaku ini.

Memutuskan kapan harus menggunakan %sebelumnya menggambarkan kesulitan dalam menentukan perilaku yacc.
Mungkin ada situasi di mana tatabahasa sebenarnya tidak salah, namun
yacc tidak dapat menafsirkannya dengan jelas. Penyelesaian ambiguitas dalam tata bahasa dapat
dalam banyak kasus diselesaikan dengan memberikan informasi tambahan, seperti menggunakan %Tipe or
%Persatuan deklarasi. Seringkali lebih mudah dan biasanya menghasilkan parser yang lebih kecil untuk diambil
alternatif ini bila diperlukan.

Ukuran dan waktu eksekusi program yang dihasilkan tanpa kode debugging runtime adalah
biasanya lebih kecil dan sedikit lebih cepat dalam implementasi historis.

Pesan statistik dari beberapa implementasi historis termasuk jenis berikut:
informasi:

n/512 terminal, n/300 non-terminal
n/600 aturan tata bahasa, n/1500 negara bagian
n menggeser/mengurangi, n mengurangi/mengurangi konflik yang dilaporkan
n/350 set kerja digunakan
Memori: status, dll. n/15000, pengurai n/ 15000
n/600 set lookahead yang berbeda
n penutupan ekstra
n pergeseran entri, n pengecualian
n entri goto
n entri disimpan oleh goto default
Ruang pengoptimal yang digunakan: masukan n/15000, keluaran n/ 15000
n entri tabel, n nol
Penyebaran maksimum: n, Offset maksimum: n

Laporan tabel internal dalam file deskripsi dibiarkan ditentukan oleh implementasi
karena semua aspek dari batasan ini juga ditentukan oleh implementasi. Beberapa implementasi
dapat menggunakan teknik alokasi dinamis dan tidak memiliki nilai batas khusus untuk dilaporkan.

Format dari y.keluaran file tidak diberikan karena spesifikasi format tidak
terlihat untuk meningkatkan portabilitas aplikasi. Daftar ini terutama ditujukan untuk membantu manusia
pengguna memahami dan men-debug parser; penggunaan y.keluaran oleh skrip aplikasi yang sesuai
akan menjadi tidak biasa. Selanjutnya, implementasi belum menghasilkan output yang konsisten dan tidak ada
format populer tampak jelas. Format yang dipilih oleh implementasi harus human-
dapat dibaca, selain persyaratan bahwa itu menjadi file teks.

Laporan kesalahan standar tidak dijelaskan secara spesifik karena jarang digunakan untuk
aplikasi yang sesuai dan tidak ada alasan untuk membatasi implementasi.

Beberapa implementasi mengenali "={" setara dengan '{' karena muncul dalam sejarah
dokumentasi. Konstruksi ini diakui dan didokumentasikan sebagai usang sejak dulu seperti
1978, dalam referensi Yak: Namun Lain Kompilator-Kompiler. Volume POSIX.1-2008 . ini
memilih untuk meninggalkannya sebagai usang dan menghilangkannya.

Karakter multi-byte harus dikenali oleh penganalisis leksikal dan dikembalikan sebagai token.
Mereka tidak boleh dikembalikan sebagai literal karakter multi-byte. Tokennya kesalahan yang digunakan
untuk pemulihan kesalahan biasanya diberi nilai 256 dalam implementasi historis.
Jadi, nilai token 256, yang digunakan dalam banyak set karakter multi-byte, tidak
tersedia untuk digunakan sebagai nilai token yang ditentukan pengguna.

MASA DEPAN ARAH


Tidak ada.

Gunakan yaccposix online menggunakan layanan onworks.net


Server & Workstation Gratis

Unduh aplikasi Windows & Linux

  • 1
    itop - Sumber Terbuka ITSM CMDB
    itop - Sumber Terbuka ITSM CMDB
    Portal Operasi TI: pembukaan lengkap
    sumber, ITIL, layanan berbasis web
    alat manajemen termasuk sepenuhnya
    CMDB yang dapat disesuaikan, sistem meja bantuan dan
    seorang pria dokumen...
    Unduh ittop - ITSM CMDB OpenSource
  • 2
    Clementine
    Clementine
    Clementine adalah musik multi-platform
    pemain dan penyelenggara perpustakaan terinspirasi oleh
    Amarok 1.4. Ini memiliki cepat dan
    antarmuka yang mudah digunakan, dan memungkinkan Anda untuk
    cari dan...
    Unduh Clementine.dll
  • 3
    XISMuS
    XISMuS
    PERHATIAN: Pembaruan kumulatif 2.4.3 telah
    telah dirilis!! Pembaruan berfungsi untuk semua
    versi 2.xx sebelumnya. Jika meningkatkan
    dari versi v1.xx, silakan unduh dan
    i ...
    Unduh XISMuS.dll
  • 4
    facetracknoir
    facetracknoir
    Program pelacakan kepala modular itu
    mendukung banyak pelacak wajah, filter
    dan protokol permainan. Di antara pelacak
    adalah SM FaceAPI, AIC Inertial Head
    Pelacak...
    Unduh facetracknoir.dll
  • 5
    Kode QR PHP
    Kode QR PHP
    Kode QR PHP adalah sumber terbuka (LGPL)
    perpustakaan untuk menghasilkan Kode QR,
    kode batang 2 dimensi. Berdasarkan
    libqrencode C library, menyediakan API untuk
    membuat batang Kode QR...
    Unduh Kode QR PHP
  • 6
    freeciv
    freeciv
    Freeciv adalah turn-based gratis
    game strategi multipemain, di mana masing-masing
    pemain menjadi pemimpin a
    peradaban, berjuang untuk mendapatkan
    tujuan akhir: menjadi...
    Unduh Freeciv.dll
  • Lebih banyak lagi »

Perintah Linux

Ad