Tiếng AnhTiếng PhápTiếng Tây Ban Nha

Ad


Biểu tượng yêu thích OnWorks

yaccposix - Trực tuyến trên đám mây

Chạy yaccposix trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks trên Ubuntu Online, Fedora Online, trình giả lập trực tuyến Windows hoặc trình mô phỏng trực tuyến MAC OS

Đây là lệnh yaccposix có thể được chạy trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks bằng cách sử dụng một trong nhiều máy trạm trực tuyến miễn phí của chúng tôi như Ubuntu Online, Fedora Online, trình giả lập trực tuyến Windows hoặc trình giả lập trực tuyến MAC OS

CHƯƠNG TRÌNH:

TÊN


yacc - chưa một trình biên dịch biên dịch khác (PHÁT TRIỂN)

SYNOPSIS


yac [−dltv] [−b tiền_tệp] [−p sym_prefix] ngữ pháp

MÔ TẢ


Sản phẩm yac tiện ích sẽ đọc mô tả về ngữ pháp không có ngữ cảnh trong ngữ pháp và viết C
mã nguồn, tuân theo tiêu chuẩn ISO C, cho một tệp mã và tiêu đề tùy chọn
thông tin vào một tệp tiêu đề, trong thư mục hiện tại. Mã nguồn được tạo sẽ
không phụ thuộc vào bất kỳ hành vi không xác định, không xác định hoặc do triển khai xác định, ngoại trừ trong
các trường hợp nó được sao chép trực tiếp từ ngữ pháp được cung cấp hoặc trong các trường hợp được
tài liệu của việc thực hiện. Mã C sẽ xác định một chức năng và các quy trình liên quan
và macro cho một máy tự động thực thi thuật toán phân tích cú pháp đáp ứng các yêu cầu trong
Các thuật toán.

Hình thức và ý nghĩa của ngữ pháp được mô tả trong phần MÔ TẢ MỞ RỘNG.

Mã nguồn C và tệp tiêu đề phải được tạo ở dạng phù hợp làm đầu vào cho C
trình biên dịch (xem c99).

LỰA CHỌN


Sản phẩm yac tiện ích sẽ phù hợp với khối lượng Định nghĩa cơ sở của POSIX.1‐2008, Phần
12.2, Tiện ích cú pháp Hướng dẫn, ngoại trừ Hướng dẫn 9.

Các tùy chọn sau sẽ được hỗ trợ:

−b tiền_tệp
Sử dụng tiền_tệp thay vì y làm tiền tố cho tất cả các tên tệp đầu ra. Mật mã
hồ sơ y.tab.c, tệp tiêu đề y.tab.h (được tạo ra khi −d được chỉ định), và
tập tin mô tả y.đầu ra (được tạo ra khi −v được chỉ định), sẽ được thay đổi thành
tiền_tệp.tab.c, tiền_tệp.tab.htiền_tệp.đầu ra, Tương ứng.

−d Viết tệp tiêu đề; theo mặc định, chỉ có tệp mã được ghi. Các #định nghĩa
các câu lệnh liên kết các mã token được chỉ định bởi yac với người dùng do người dùng khai báo
tên mã thông báo. Điều này cho phép các tệp nguồn khác y.tab.c để truy cập mã thông báo
mã số.

−l Tạo một tệp mã không chứa bất kỳ #hàng cấu trúc. Nếu tùy chọn này
không có mặt, không xác định được liệu tệp mã hoặc tệp tiêu đề có chứa
#hàng các chỉ thị. Điều này chỉ nên được sử dụng sau ngữ pháp và liên kết
các hành động được gỡ lỗi đầy đủ.

−p sym_prefix
Sử dụng sym_prefix thay vì yy làm tiền tố cho tất cả các tên bên ngoài do
yac. Các tên bị ảnh hưởng phải bao gồm các chức năng yyparse(), yylex(), và
lỗi yy() và các biến yylval, yycharyydebug. (Trong phần còn lại của
phần này, sáu ký hiệu được trích dẫn được tham chiếu bằng tên mặc định của chúng
chỉ như một sự tiện lợi về mặt lưu ý.) Tên địa phương cũng có thể bị ảnh hưởng bởi −p
lựa chọn; tuy nhiên, −p tùy chọn sẽ không ảnh hưởng #định nghĩa các ký hiệu được tạo ra bởi
yac.

−t Sửa đổi chỉ thị biên dịch có điều kiện để cho phép biên dịch gỡ lỗi
mã trong tệp mã. Các câu lệnh gỡ lỗi thời gian chạy sẽ luôn được chứa trong
tệp mã, nhưng theo mặc định, các lệnh biên dịch có điều kiện ngăn chặn
biên dịch.

−v Viết tệp chứa mô tả về trình phân tích cú pháp và báo cáo xung đột
được tạo ra bởi sự mơ hồ trong ngữ pháp.

TOÁN HẠNG


Toán hạng sau là bắt buộc:

ngữ pháp Tên đường dẫn của tệp chứa hướng dẫn, sau đây được gọi là ngữ pháp, Cho
mà một trình phân tích cú pháp sẽ được tạo. Định dạng cho ngữ pháp được mô tả trong
PHẦN MÔ TẢ MỞ RỘNG.

STDIN


Không được sử dụng.

ĐẦU VÀO CÁC TẬP TIN


Tập tin ngữ pháp sẽ là một tệp văn bản được định dạng như được chỉ định trong MÔ TẢ ĐÃ MỞ RỘNG
phần.

MÔI TRƯỜNG BIẾN


Các biến môi trường sau đây sẽ ảnh hưởng đến việc thực hiện yac:

NGÔN NGỮ Cung cấp giá trị mặc định cho các biến quốc tế hóa chưa được đặt hoặc
vô giá trị. (Xem tập Định nghĩa cơ bản của POSIX.1‐2008, Phần 8.2,
quốc tế hóa Biến ưu tiên quốc tế hóa
các biến được sử dụng để xác định giá trị của danh mục ngôn ngữ.)

LC_ALL Nếu được đặt thành giá trị chuỗi không trống, hãy ghi đè giá trị của tất cả các chuỗi khác
các biến quốc tế hóa.

LC_CTYPE Xác định ngôn ngữ để diễn giải chuỗi byte dữ liệu văn bản
dưới dạng ký tự (ví dụ: byte đơn trái ngược với ký tự nhiều byte trong
đối số và tệp đầu vào).

LC_MESSAGES
Xác định ngôn ngữ sẽ được sử dụng để ảnh hưởng đến định dạng và nội dung của
thông báo chẩn đoán được ghi vào lỗi tiêu chuẩn.

NLSPATH Xác định vị trí của danh mục thư để xử lý LC_MESSAGES.

Sản phẩm NGÔN NGỮLC_ * các biến ảnh hưởng đến việc thực thi yac tiện ích như đã nêu. Các chính()
chức năng được xác định trong Yacc Thư viện sẽ gọi:

setlocale (LC_ALL, "")

và do đó, chương trình được tạo ra bởi yac cũng sẽ bị ảnh hưởng bởi nội dung của những
các biến trong thời gian chạy.

BẤT NGỜ SỰ KIỆN


Mặc định.

GIỚI THIỆU


Không được sử dụng.

STDERR


Nếu xung đột shift / giảm hoặc giảm / giảm được phát hiện trong ngữ pháp, yac sẽ viết một
báo cáo về những xung đột đó với lỗi tiêu chuẩn ở định dạng không xác định.

Lỗi chuẩn cũng sẽ được sử dụng cho các thông báo chẩn đoán.

OUTPUT CÁC TẬP TIN


Tệp mã, tệp tiêu đề và tệp mô tả phải là tệp văn bản. Tất cả đều
được mô tả trong các phần sau.

Tập tin
Tệp này sẽ chứa mã nguồn C cho yyparse() chức năng. Nó sẽ chứa
mã cho các hành động ngữ nghĩa khác nhau với thay thế macro được thực hiện trên chúng như
được mô tả trong phần MÔ TẢ MỞ RỘNG. Nó cũng sẽ chứa một bản sao của #định nghĩa
các câu lệnh trong tệp tiêu đề. Nếu một %liên hiệp khai báo được sử dụng, khai báo cho
YYSTYPE cũng sẽ được bao gồm trong tệp này.

Tiêu đề Tập tin
Tệp tiêu đề sẽ chứa #định nghĩa các câu lệnh liên kết số mã thông báo với
tên mã thông báo. Điều này cho phép các tệp nguồn khác với tệp mã truy cập vào mã token.
Nếu một %liên hiệp khai báo được sử dụng, khai báo cho YYSTYPE và một bên ngoài YYSLOẠI yylval
khai báo cũng sẽ được bao gồm trong tệp này.

Mô tả Tập tin
Tệp mô tả sẽ là tệp văn bản chứa mô tả về máy trạng thái
tương ứng với trình phân tích cú pháp, sử dụng định dạng không xác định. Giới hạn cho các bảng nội bộ (xem
Giới hạn) cũng sẽ được báo cáo, theo cách thức thực hiện được xác định. (Một số triển khai
có thể sử dụng kỹ thuật phân bổ động và không có giá trị giới hạn cụ thể để báo cáo.)

ĐA THẾ HỆ MÔ TẢ


Sản phẩm yac lệnh chấp nhận một ngôn ngữ được sử dụng để xác định ngữ pháp cho một ngôn ngữ đích
được phân tích cú pháp bởi các bảng và mã được tạo bởi yac. Ngôn ngữ được chấp nhận bởi yac như là một
ngữ pháp cho ngôn ngữ đích được mô tả bên dưới bằng cách sử dụng yac chính ngôn ngữ đầu vào.

Đầu vào ngữ pháp bao gồm các quy tắc mô tả cấu trúc đầu vào của ngôn ngữ đích và
mã được gọi khi các quy tắc này được công nhận để cung cấp ngữ nghĩa liên quan
hoạt động. Đoạn mã được thực thi sẽ xuất hiện dưới dạng phần thân của văn bản nhằm mục đích C-
mật ngữ. Các phần nội dung văn bản này không được chứa các đoạn văn bằng ngôn ngữ C. Ngôn ngữ C
bao gồm được cho là tạo thành một chức năng chính xác khi được xử lý bởi yac vào đầu ra của nó
các tập tin. Mã bao gồm theo cách này sẽ được thực thi trong quá trình nhận dạng
ngôn ngữ mục tiêu.

Với một ngữ pháp, yac tiện ích tạo các tệp được mô tả trong CÁC LỌC ĐẦU RA
tiết diện. Tệp mã có thể được biên dịch và liên kết bằng cách sử dụng c99. Nếu khai báo và
các phần chương trình của tệp ngữ pháp không bao gồm các định nghĩa về chính(), yylex(), và
lỗi yy(), đầu ra đã biên dịch yêu cầu liên kết với các phiên bản được cung cấp bên ngoài của những
chức năng. Phiên bản mặc định của chính() và lỗi yy() được cung cấp trong yac thư viện và
có thể được liên kết bằng cách sử dụng −l y toán hạng cho c99. Các yac giao diện thư viện không cần
hỗ trợ các giao diện khác với giao diện mặc định yy tiền tố biểu tượng. Ứng dụng cung cấp
chức năng phân tích từ vựng, yylex(); các lex tiện ích được thiết kế đặc biệt để
tạo ra một thói quen như vậy.

Đầu vào Ngôn ngữ
Ứng dụng phải đảm bảo rằng mọi tệp thông số kỹ thuật bao gồm ba phần trong
gọi món: tờ khai, ngữ pháp quy tắcchương trình, cách nhau bằng đôi
nhân vật ("%%"). Phần khai báo và chương trình có thể để trống. Nếu cái sau là
trống rỗng, ở trước "%%" có thể bỏ qua đánh dấu tách nó khỏi phần quy tắc.

Đầu vào là văn bản dạng tự do tuân theo cấu trúc của ngữ pháp được xác định bên dưới.

từ vựng Structure of các Ngữ pháp
Các , , và ký tự sẽ bị bỏ qua, ngoại trừ
ứng dụng sẽ đảm bảo rằng chúng không xuất hiện trong tên hoặc nhiều ký tự dành riêng
các ký hiệu. Nhận xét sẽ được đính kèm trong "/ * hữu ích. Cảm ơn ! * / "và có thể xuất hiện ở bất kỳ nơi nào có tên
có hiệu lực.

Tên có độ dài tùy ý, được tạo thành từ các chữ cái, dấu chấm ('.'), dấu gạch dưới ('_'), Và
các chữ số không đầu tiên. Chữ hoa và chữ thường khác nhau. Ứng dụng phù hợp
không được sử dụng tên bắt đầu bằng yy or YY kể từ khi yac trình phân tích cú pháp sử dụng các tên như vậy. Nhiều
tên xuất hiện trong kết quả cuối cùng của yacvà do đó chúng nên được chọn để phù hợp
với bất kỳ quy tắc bổ sung nào được tạo bởi trình biên dịch C sẽ được sử dụng. Đặc biệt chúng xuất hiện
in #định nghĩa các câu lệnh.

Một chữ sẽ bao gồm một ký tự duy nhất được đặt trong các ký tự dấu ngoặc kép. Tất cả
trình tự thoát được hỗ trợ cho các hằng số ký tự theo tiêu chuẩn ISO C phải là
được hỗ trợ bởi yac.

Mối quan hệ với bộ phân tích từ vựng được thảo luận chi tiết dưới đây.

Ứng dụng sẽ đảm bảo rằng ký tự NUL không được sử dụng trong các quy tắc ngữ pháp hoặc
nghĩa đen.

Tuyên bố Phần
Phần khai báo được sử dụng để xác định các ký hiệu được sử dụng để xác định ngôn ngữ đích
và mối quan hệ của họ với nhau. Đặc biệt, nhiều thông tin bổ sung
cần thiết để giải quyết sự mơ hồ trong ngữ pháp không có ngữ cảnh cho ngôn ngữ đích là
được cung cấp tại đây.

Thông thường yac chỉ định mối quan hệ giữa các tên tượng trưng mà nó tạo ra và
giá trị số cơ bản. Phần khai báo giúp bạn có thể kiểm soát
gán các giá trị này.

Cũng có thể giữ thông tin ngữ nghĩa được liên kết với các mã thông báo hiện tại
ngăn xếp phân tích cú pháp bằng ngôn ngữ C do người dùng xác định công đoàn, nếu các thành viên của công đoàn
liên kết với các tên khác nhau trong ngữ pháp. Phần khai báo cung cấp cho
cái này cũng vậy.

Nhóm khai báo đầu tiên dưới đây đều lấy danh sách tên làm đối số. Danh sách đó có thể
tùy chọn được đặt trước tên của một thành viên công đoàn C (được gọi là tag bên dưới) xuất hiện
ở trong '<''>'. (Là một ngoại lệ đối với các quy ước đánh máy của phần còn lại của điều này
khối lượng của POSIX.1‐2008, trong trường hợp nàytag> không đại diện cho một biến số, nhưng
các ký tự trong ngoặc vuông góc theo nghĩa đen bao quanh một biểu tượng.) Việc sử dụng tag xác định rằng
mã thông báo có tên trên dòng này phải cùng loại C với thành viên liên hiệp được tham chiếu bởi
tag. Điều này được thảo luận chi tiết hơn bên dưới.

Đối với danh sách được sử dụng để xác định mã thông báo, sự xuất hiện đầu tiên của một mã thông báo nhất định có thể được theo sau bởi
một số nguyên dương (dưới dạng một chuỗi các chữ số thập phân). Nếu điều này được thực hiện, giá trị cơ bản
được gán cho nó cho mục đích từ vựng sẽ được coi là số đó.

Các tuyên bố sau đây tên trở thành một mã thông báo:

%mã thông báo [<tag>] tên [con số] [tên [con số]]hữu ích. Cảm ơn !

If tag hiện tại, loại C cho tất cả các mã thông báo trên dòng này sẽ được khai báo là loại
được tham chiếu bởi tag. Nếu một số nguyên dương, con số, sau một tên, giá trị đó sẽ là
được chỉ định cho mã thông báo.

Các tuyên bố sau đây tên trở thành một mã thông báo và chỉ định mức độ ưu tiên cho nó:

%bên trái [<tag>] tên [con số] [tên [con số]]hữu ích. Cảm ơn !
%bên phải [<tag>] tên [con số] [tên [con số]]hữu ích. Cảm ơn !

Một hoặc nhiều dòng, mỗi dòng bắt đầu bằng một trong các ký hiệu này, có thể xuất hiện trong phần này.
Tất cả các mã thông báo trên cùng một dòng có cùng mức độ ưu tiên và tính liên kết; những dòng kẻ
theo thứ tự tăng mức độ ưu tiên hoặc độ bền liên kết. %bên trái biểu thị rằng
các toán tử trên dòng đó được kết hợp trái và %bên phải tương tự biểu thị đúng
toán tử kết hợp. Nếu như tag hiện tại, nó sẽ khai báo một loại C cho têns như được mô tả
cho %mã thông báo.

Các tuyên bố sau đây tên trở thành một mã thông báo và cho biết rằng không thể sử dụng mã này
liên kết:

% nonassoc [<tag>] tên [con số] [tên [con số]]hữu ích. Cảm ơn !

Nếu trình phân tích cú pháp gặp phải việc sử dụng liên kết mã thông báo này, nó sẽ báo lỗi. Nếu như tag is
hiện tại, nó sẽ khai báo một loại C cho têns như được mô tả cho %mã thông báo.

Sau đây tuyên bố rằng đoàn viên têns không phải là thiết bị đầu cuối và do đó nó được yêu cầu
để có một tag trường ở đầu:

%kiểu <tag> tênhữu ích. Cảm ơn !

Bởi vì nó chỉ xử lý với các thiết bị đầu cuối không phải là thiết bị đầu cuối, việc chỉ định một số mã thông báo hoặc sử dụng một ký tự là
cũng bị cấm. Nếu cấu trúc này có mặt, yac sẽ thực hiện kiểm tra kiểu; nếu cái này
cấu trúc không có mặt, ngăn xếp phân tích cú pháp sẽ chỉ chứa int kiểu.

Mọi tên được sử dụng trong ngữ pháp không được định nghĩa bởi một %mã thông báo, %bên trái, %bên phải, hoặc là % nonassoc
khai báo được giả định là đại diện cho một ký hiệu không phải đầu cuối. Các yac tiện ích sẽ báo cáo
một lỗi cho bất kỳ ký hiệu không phải đầu cuối nào không xuất hiện ở bên trái của ít nhất một
Quy tắc ngữ pháp.

Sau khi loại, mức độ ưu tiên hoặc số mã thông báo của một tên được chỉ định, nó sẽ không được
đã thay đổi. Nếu khai báo đầu tiên của mã thông báo không chỉ định số mã thông báo, yac phải
chỉ định một số mã thông báo. Khi việc chỉ định này được thực hiện, số mã thông báo sẽ không được thay đổi
bằng cách phân công rõ ràng.

Các bộ khai báo sau không tuân theo mẫu trước đó.

Phần sau khai báo không phải thiết bị đầu cuối tên để trở thành Bắt đầu biểu tượng, đại diện cho
cấu trúc lớn nhất, chung nhất được mô tả bởi các quy tắc ngữ pháp:

%bắt đầu tên

Theo mặc định, nó là bên trái của quy tắc ngữ pháp đầu tiên; mặc định này có thể là
ghi đè với khai báo này.

Sau đây khai báo yac ngăn xếp giá trị trở thành sự kết hợp của nhiều loại giá trị khác nhau
mong muốn.

%liên hiệp { thân hình of công đoàn (in C)}

Phần thân của union không được chứa các mã tiền xử lý trước dấu ngoặc nhọn không cân bằng.

Theo mặc định, các giá trị được trả về bởi các hành động (xem bên dưới) và máy phân tích từ vựng sẽ là
loại int. Các yac tiện ích theo dõi các loại và nó sẽ chèn tương ứng
tên thành viên để thực hiện kiểm tra kiểu nghiêm ngặt của trình phân tích cú pháp kết quả.

Ngoài ra, cho rằng ít nhất mộttag> cấu trúc được sử dụng, liên minh có thể được khai báo
trong tệp tiêu đề (tệp này sẽ được bao gồm trong phần khai báo bằng cách sử dụng #include
xây dựng bên trong %{%}), và một đánh máy được sử dụng để xác định biểu tượng YYSTYPE để đại diện
công đoàn này. Ảnh hưởng của %liên hiệp là cung cấp khai báo YYSTYPE trực tiếp từ
các yac đầu vào.

Các khai báo và định nghĩa ngôn ngữ C có thể xuất hiện trong phần khai báo, kèm theo
bằng các dấu sau:

%{ hữu ích. Cảm ơn ! %}

Các câu lệnh này sẽ được sao chép vào tệp mã và có phạm vi toàn cầu trong đó
mà chúng có thể được sử dụng trong các quy tắc và phần chương trình. Các tuyên bố sẽ không chứa
"%}" bên ngoài một nhận xét, chuỗi ký tự hoặc hằng số nhiều ký tự.

Ứng dụng sẽ đảm bảo rằng phần khai báo được kết thúc bằng mã thông báo %%.

Ngữ pháp Nội quy in yac
Phần quy tắc xác định ngữ pháp không có ngữ cảnh để được hàm chấp nhận yac
tạo và liên kết với các quy tắc đó Các hành động trong ngôn ngữ C và mức độ ưu tiên bổ sung
thông tin. Ngữ pháp được mô tả bên dưới và một định nghĩa chính thức sau đây.

Phần quy tắc bao gồm một hoặc nhiều quy tắc ngữ pháp. Quy tắc ngữ pháp có dạng:

A : BODY ;

Biểu tượng A đại diện cho một tên không phải đầu cuối và BODY đại diện cho một chuỗi số không hoặc
chi tiết têns, nghĩa đens, và ngữ nghĩa hoạt độngsau đó có thể được theo sau bởi tùy chọn
quyền ưu tiên loại trừS. Chỉ tên và chữ tham gia vào việc hình thành
văn phạm; các hành động ngữ nghĩa và quy tắc ưu tiên được sử dụng theo những cách khác. Các và
các Chúng tôi yac chấm câu. Nếu có một số quy tắc ngữ pháp liên tiếp với
cùng phía bên trái, ('|') có thể được sử dụng để tránh viết lại
phía tay trái; trong trường hợp này chỉ xuất hiện sau quy tắc cuối cùng. Cơ thể
một phần có thể để trống (hoặc để trống tên và chữ) để chỉ ra rằng phần tử không phải là thiết bị đầu cuối
biểu tượng khớp với chuỗi trống.

Sản phẩm yac tiện ích chỉ định một số duy nhất cho mỗi quy tắc. Quy tắc sử dụng thanh dọc
ký hiệu là các quy tắc riêng biệt. Số được chỉ định cho quy tắc xuất hiện trong mô tả
tập tin.

Các phần tử bao gồm BODY là:

tên, nghĩa đen
Những điều này tạo thành các quy tắc của ngữ pháp: tên hoặc là một mã thông báo hoặc một không thiết bị đầu cuối;
nghĩa đen là viết tắt của chính nó (trừ dấu ngoặc kép bắt buộc về mặt từ vựng).

ngữ nghĩa hoạt động
Với mỗi quy tắc ngữ pháp, người dùng có thể liên kết các hành động sẽ được thực hiện mỗi lần
quy tắc được công nhận trong quá trình đầu vào. (Lưu ý rằng từ `` hành động '' có thể
cũng đề cập đến các hành động của trình phân tích cú pháp — shift, Reduce, v.v.)

Các hành động này có thể trả về giá trị và có thể lấy các giá trị được trả về trước đó
các hành động. Các giá trị này được giữ trong các đối tượng kiểu YYSTYPE (xem %liên hiệp). Các
giá trị kết quả của hành động sẽ được giữ trên ngăn xếp phân tích cú pháp ở bên trái
bên phải của quy tắc, được truy cập bởi các phần giảm thiểu khác như một phần bên phải của họ
cạnh. Bằng cách sử dụngtag> thông tin được cung cấp trong phần khai báo,
mã được tạo bởi yac có thể được kiểm tra loại nghiêm ngặt và chứa tùy ý
thông tin. Ngoài ra, máy phân tích từ vựng có thể cung cấp các loại
giá trị cho mã thông báo, nếu muốn.

Một hành động là một câu lệnh C tùy ý và như vậy có thể thực hiện nhập hoặc xuất, gọi
chương trình con và thay đổi các biến bên ngoài. Một hành động là một hoặc nhiều câu lệnh C
được đặt trong dấu ngoặc nhọn '{''}'. Các tuyên bố sẽ không chứa
mã thông báo tiền xử lý dấu ngoặc nhọn không cân bằng.

Một số biến giả nhất định có thể được sử dụng trong hành động. Đây là các macro để truy cập
cấu trúc dữ liệu được biết đến trong nội bộ yac.

$$ Có thể đặt giá trị của hành động bằng cách gán nó cho $$. Nếu loại
kiểm tra được bật và loại giá trị được chỉ định không thể được
xác định, một thông báo chẩn đoán có thể được tạo.

$con số Điều này đề cập đến giá trị được trả về bởi thành phần được chỉ định bởi
mã thông báo con số ở phía bên phải của quy tắc, đọc từ trái sang phải;
con số có thể bằng XNUMX hoặc âm. Nếu như con số bằng XNUMX hoặc âm, nó
đề cập đến dữ liệu được liên kết với tên trên ngăn xếp của trình phân tích cú pháp
trước biểu tượng ngoài cùng bên trái của quy tắc hiện tại. (Đó là, "$ 0"
đề cập đến tên ngay trước tên ngoài cùng bên trái trong
quy tắc hiện tại được tìm thấy trên ngăn xếp của trình phân tích cú pháp và "$ −1" đề cập đến
biểu tượng cho của nó trái.) Nếu con số đề cập đến một phần tử trong quá khứ hiện tại
điểm trong quy tắc hoặc vượt ra ngoài cuối ngăn xếp, kết quả là
chưa xác định. Nếu tính năng kiểm tra loại được bật và loại giá trị được
không thể xác định được chỉ định, một thông báo chẩn đoán có thể được tạo.

$<tag>con số
Chúng tương ứng chính xác với các ký hiệu tương ứng mà không có tag
bao gồm, nhưng cho phép kiểm tra loại nghiêm ngặt (và loại trừ không mong muốn
chuyển đổi loại). Hiệu quả là macro được mở rộng để sử dụng tag
để chọn một phần tử từ liên hiệp YYSTYPE (sử dụng tên dữ liệu.tag).
Điều này đặc biệt hữu ích nếu con số là không tích cực.

$<tag> $ Điều này áp đặt cho loại tham chiếu của thành viên liên hiệp được tham chiếu
by tag. Cấu trúc này có thể áp dụng khi tham chiếu đến bên trái
giá trị ngữ cảnh xuất hiện trong ngữ pháp và cung cấp yac với một phương tiện
để chọn một loại.

Các hành động có thể xảy ra ở bất kỳ đâu trong một quy tắc (không chỉ ở phần cuối); một hành động có thể truy cập
các giá trị được trả về bởi các hành động ở bên trái của nó và đến lượt nó, giá trị mà nó trả về có thể là
được truy cập bằng các hành động bên phải của nó. Một hành động xuất hiện ở giữa quy tắc
sẽ tương đương với việc thay thế hành động bằng một ký hiệu không phải đầu cuối mới và
thêm một quy tắc trống có ký hiệu không phải đầu cuối đó ở phía bên trái. Các
hành động ngữ nghĩa được liên kết với quy tắc mới sẽ tương đương với
hoạt động. Việc sử dụng các hành động trong các quy tắc có thể tạo ra các xung đột không
nếu không thì tồn tại.

Theo mặc định, giá trị của một quy tắc sẽ là giá trị của phần tử đầu tiên trong đó.
Nếu phần tử đầu tiên không có kiểu (đặc biệt trong trường hợp
theo nghĩa đen) và kiểm tra kiểu được bật bởi %kiểu, một thông báo lỗi sẽ dẫn đến.

quyền ưu tiên
Từ khóa % Pre có thể được sử dụng để thay đổi mức độ ưu tiên được liên kết với
quy tắc ngữ pháp cụ thể. Ví dụ về điều này là trong trường hợp một đơn nguyên và nhị phân
toán tử có cùng một biểu diễn tượng trưng, ​​nhưng cần được cung cấp khác nhau
tiền lệ hoặc nơi xử lý cấu trúc if-else không rõ ràng
cần thiết. Biểu tượng dành riêng % Pre có thể xuất hiện ngay sau phần thân của
quy tắc ngữ pháp và có thể được theo sau bởi một tên mã thông báo hoặc một ký tự. Nó có trách nhiệm
khiến mức độ ưu tiên của quy tắc ngữ pháp trở thành mức độ ưu tiên của mã thông báo sau
tên hoặc nghĩa đen. Hành động cho toàn bộ quy tắc có thể tuân theo % Pre.

Nếu một phần chương trình tuân theo, ứng dụng sẽ đảm bảo rằng các quy tắc ngữ pháp được
chấm dứt bởi %%.

Khóa Học Phần
Sản phẩm chương trình phần có thể bao gồm định nghĩa của máy phân tích từ vựng yylex(), và bất kỳ
cac chưc năng khac; ví dụ: những từ được sử dụng trong các hành động được chỉ định trong các quy tắc ngữ pháp. Nó
không xác định liệu phần chương trình đứng trước hay theo sau các hành động ngữ nghĩa trong
tệp đầu ra; do đó, nếu ứng dụng chứa bất kỳ định nghĩa macro nào và
các khai báo nhằm áp dụng cho mã trong các hành động ngữ nghĩa, nó sẽ đặt chúng
ở trong "% { hữu ích. Cảm ơn ! %} " trong phần khai báo.

Đầu vào Ngữ pháp
Đầu vào sau đây cho yac mang lại một trình phân tích cú pháp cho đầu vào yac. Cú pháp chính thức này
được ưu tiên hơn so với mô tả cú pháp văn bản trước đó.

Cấu trúc từ vựng được định nghĩa ít chính xác hơn; từ vựng Structure of các Ngữ pháp định nghĩa
hầu hết các điều khoản. Sự tương ứng giữa các điều khoản trước và các mã thông báo bên dưới là
theo sau.

số nhận dạng Điều này tương ứng với khái niệm tên, đã đưa ra trước đây. Nó cũng bao gồm
các chữ như đã định nghĩa trước đó.

C_IDENTIFIER
Đây là một cái tên, và ngoài ra nó còn được biết đến theo sau bởi . MỘT
nghĩa đen không thể mang lại mã thông báo này.

CON SỐ Một chuỗi các chữ số (một số nguyên thập phân không âm).

LOẠI, LEFT, DẤU, LCURL, RCURL
Những thứ này tương ứng trực tiếp với %kiểu, %bên trái, %%, %{%}.

{ hữu ích. Cảm ơn ! } Điều này cho biết mã nguồn ngôn ngữ C, có thể bao gồm '$'
macro như đã thảo luận trước đây.

/* Ngữ pháp cho các đầu vào đến yacc. */
/* Cơ bản mục. */
/* Sản phẩm tiếp theo đang công nhận by các từ vựng máy phân tích. */

% mã thông báo IDENTIFIER / * Bao gồm số nhận dạng và ký tự * /
% mã thông báo C_IDENTIFIER / * mã định danh (nhưng không phải theo nghĩa đen)
Theo sau là một :. * /
% mã thông báo NUMBER / * [0-9] [0-9] * * /

/ * Các từ dành riêng:% type => TYPE% còn lại => LEFT, v.v. * /

% mã thông báo LEFT RIGHT NONASSOC TOKEN LOẠI CHÍNH XÁC BẮT ĐẦU ĐOÀN KẾT

% mã thông báo MARK / * Dấu %%. * /
% mã thông báo LCURL / * Dấu% {. * /
% mã thông báo RCURL / * Dấu%}. * /

/ * Các ký tự 8 bit tự viết tắt cho chính nó; * /
Mã / * phải được xác định cho các ký tự nhiều byte. * /

% start spec

%%

spec: defs Đuôi quy tắc MARK
;
đuôi: ĐÁNH DẤU
{
/ * Trong hành động này, hãy thiết lập phần còn lại của tệp. * /
}
| /* Trống; MARK thứ hai là tùy chọn. * /
;
định nghĩa: / * Rỗng. * /
| chắc chắn chắc chắn
;
def: START IDENTIFIER
| LIÊN HIỆP
{
/ * Sao chép định nghĩa liên hợp vào đầu ra. * /
}
| LCURL
{
/ * Sao chép mã C vào tệp đầu ra. * /
}
RCURL
| danh sách thẻ rword
;
rword: TOKEN
| BÊN TRÁI
| BÊN PHẢI
| NONASSOC
| LOẠI
;
tag: / * Rỗng: ID thẻ liên hợp tùy chọn. * /
| '<' IDENTIFIER '>'
;
nlist: nmno
| nlist nmno
;
nmno: IDENTIFIER / * Lưu ý: chữ không hợp lệ với loại%. * /
| SỐ XÁC ĐỊNH / * Lưu ý: không hợp lệ với loại%. * /
;

/ * Phần quy tắc * /

quy tắc: C_IDENTIFIER rbody trước
| quy tắc quy tắc
;
quy tắc: C_IDENTIFIER rbody trước
| '|' rbody trước
;
rbody: / ​​* trống * /
| mã nhận dạng rbody
| ai hành động
;
hành động : '{'
{
/ * Sao chép hành động, dịch $$, v.v. * /
}
'}'
;
Pre: / * Rỗng * /
| SỐ NHẬN DẠNG CHÍNH XÁC
| Hành động PREC IDENTIFIER
| trước ';'
;

Xung đột
Trình phân tích cú pháp được tạo cho ngữ pháp đầu vào có thể chứa các trạng thái mà xung đột xảy ra. Các
xung đột xảy ra vì ngữ pháp không LALR(1). Ngữ pháp không rõ ràng luôn chứa
ít nhất một LALR(1) xung đột. Các yac tiện ích sẽ giải quyết tất cả các xung đột, sử dụng
quy tắc mặc định hoặc quy tắc ưu tiên do người dùng chỉ định.

Xung đột là dịch chuyển / giảm xung đột hoặc giảm / giảm xung đột. Một sự thay đổi / giảm bớt
xung đột là nơi, đối với một trạng thái nhất định và biểu tượng hướng nhìn, cả một hành động thay đổi và một
giảm bớt hành động là có thể. Giảm / giảm xung đột là ở đâu, đối với một trạng thái nhất định và
biểu tượng lookahead, có thể giảm theo hai quy tắc khác nhau.

Các quy tắc dưới đây mô tả cách chỉ định những hành động cần thực hiện khi xung đột xảy ra. Không
tất cả các xung đột thay đổi / giảm bớt có thể được giải quyết thành công theo cách này vì xung đột có thể
là do điều gì đó khác ngoài sự mơ hồ, vì vậy việc sử dụng không cẩn thận các phương tiện này có thể gây ra
ngôn ngữ được trình phân tích cú pháp chấp nhận khác nhiều so với ngôn ngữ đã định. Các
tệp mô tả phải chứa đầy đủ thông tin để hiểu nguyên nhân của
xung đột. Trong đó sự không rõ ràng là lý do khiến các quy tắc mặc định hoặc rõ ràng phải là
đủ để tạo ra một trình phân tích cú pháp hoạt động.

Các tiền lệ và liên kết đã khai báo (xem Tuyên bố Phần) được sử dụng để
giải quyết xung đột phân tích cú pháp như sau:

1. Mức độ ưu tiên và tính liên kết được liên kết với mỗi quy tắc ngữ pháp; nó là
mức độ ưu tiên và tính liên kết của mã thông báo hoặc chữ cuối cùng trong phần nội dung của quy tắc. Nếu như
các % Pre từ khóa được sử dụng, nó sẽ ghi đè mặc định này. Một số quy tắc ngữ pháp có thể không
có cả tính ưu tiên và tính liên kết.

2. Nếu có xung đột shift / giảm và cả quy tắc ngữ pháp và ký hiệu đầu vào
có mức độ ưu tiên và tính liên kết gắn liền với chúng, sau đó xung đột được giải quyết
có lợi cho hành động (thay đổi hoặc giảm) được liên kết với mức độ ưu tiên cao hơn. Nếu
các tiền lệ giống nhau, sau đó tính liên kết được sử dụng; ngụ ý kết hợp trái
giảm, kết hợp phải ngụ ý thay đổi và không liên kết ngụ ý một lỗi trong
chuỗi đang được phân tích cú pháp.

3. Khi có một sự thay đổi / giảm xung đột mà không thể giải quyết bằng quy tắc 2, sự thay đổi đó là
làm xong. Các xung đột được giải quyết theo cách này được tính trong kết quả chẩn đoán được mô tả trong
lỗi Xử lý.

4. Khi có xung đột giảm / giảm, việc giảm bớt được thực hiện theo quy tắc ngữ pháp
xảy ra sớm hơn trong chuỗi đầu vào. Các xung đột được giải quyết theo cách này được tính vào
đầu ra chẩn đoán được mô tả trong lỗi Xử lý.

Các xung đột được giải quyết theo thứ tự ưu tiên hoặc liên kết sẽ không được tính vào sự thay đổi / giảm bớt
và giảm / giảm xung đột được báo cáo bởi yac trên một trong hai lỗi tiêu chuẩn hoặc trong
tập tin mô tả.

lỗi Xử lý
Mã thông báo lôi sẽ được dành riêng cho việc xử lý lỗi. Tên lôi có thể được sử dụng trong
quy tắc ngữ pháp. Nó chỉ ra những nơi mà trình phân tích cú pháp có thể khôi phục sau một lỗi cú pháp. Các
giá trị mặc định của lôi sẽ là 256. Giá trị của nó có thể được thay đổi bằng cách sử dụng %mã thông báo tờ khai.
Máy phân tích từ vựng không được trả về giá trị của lôi.

Trình phân tích cú pháp sẽ phát hiện lỗi cú pháp khi nó ở trạng thái mà hành động được liên kết
với biểu tượng lookahead là lôi. Một hành động ngữ nghĩa có thể khiến trình phân tích cú pháp bắt đầu
xử lý lỗi bằng cách thực thi macro YYERROR. Khi YYERROR được thực thi, ngữ nghĩa
hành động chuyển quyền kiểm soát trở lại trình phân tích cú pháp. YYERROR không thể được sử dụng bên ngoài ngữ nghĩa
hành động.

Khi trình phân tích cú pháp phát hiện lỗi cú pháp, nó thường gọi lỗi yy() với nhân vật
chuỗi "cú pháp lỗi" như đối số của nó. Cuộc gọi sẽ không được thực hiện nếu trình phân tích cú pháp vẫn còn
khôi phục từ một lỗi trước đó khi lỗi được phát hiện. Trình phân tích cú pháp được coi là
đang khôi phục từ một lỗi trước đó cho đến khi trình phân tích cú pháp chuyển qua ít nhất ba
các ký hiệu đầu vào bình thường kể từ khi lỗi cuối cùng được phát hiện hoặc một hành động ngữ nghĩa đã được thực thi
vĩ mô yyerrok. Trình phân tích cú pháp sẽ không gọi lỗi yy() khi YYERROR được thực thi.

Hàm macro YYRECOVERING sẽ trả về 1 nếu lỗi cú pháp được phát hiện và
phân tích cú pháp vẫn chưa hoàn toàn phục hồi từ nó. Nếu không, số không sẽ được trả về.

Khi một lỗi cú pháp được phát hiện bởi trình phân tích cú pháp, trình phân tích cú pháp sẽ kiểm tra xem cú pháp trước đó
lỗi đã được phát hiện. Nếu lỗi trước đó được phát hiện và nếu không có ký hiệu đầu vào bình thường
đã được thay đổi kể từ khi lỗi trước đó được phát hiện, trình phân tích cú pháp sẽ kiểm tra xem
biểu tượng lookahead là một điểm đánh dấu (xem Giao thức đến các từ vựng Máy phân tích). Nếu đúng như vậy,
phân tích cú pháp sẽ trả về giá trị khác XNUMX. Nếu không, biểu tượng đầu nhìn sẽ là
bị loại bỏ và phân tích cú pháp bình thường sẽ tiếp tục.

Khi YYERROR được thực thi hoặc khi trình phân tích cú pháp phát hiện ra lỗi cú pháp và không có lỗi trước đó
đã được phát hiện hoặc ít nhất một biểu tượng đầu vào bình thường đã được thay đổi so với trước đó
lỗi được phát hiện, trình phân tích cú pháp sẽ bật lại một trạng thái tại một thời điểm cho đến khi ngăn xếp phân tích cú pháp
trống hoặc trạng thái hiện tại cho phép thay đổi lôi. Nếu trình phân tích cú pháp trống
ngăn xếp, nó sẽ trả về với giá trị khác XNUMX. Nếu không, nó sẽ thay đổi lôi
sau đó tiếp tục phân tích cú pháp bình thường. Nếu trình phân tích cú pháp đọc một biểu tượng tìm kiếm trước khi xảy ra lỗi
được phát hiện, biểu tượng đó sẽ vẫn là biểu tượng tìm kiếm khi quá trình phân tích cú pháp được tiếp tục.

Macro yyerrok trong một hành động ngữ nghĩa sẽ khiến trình phân tích cú pháp hoạt động như thể nó có đầy đủ
phục hồi từ bất kỳ lỗi nào trước đó. Macro yyclearin sẽ khiến trình phân tích cú pháp loại bỏ
mã thông báo tìm kiếm hiện tại. Nếu mã thông báo lookahead hiện tại chưa được đọc,
yyclearin sẽ không có hiệu lực.

Macro YYACCEPT sẽ khiến trình phân tích cú pháp trả về giá trị bằng không. Macro YYABORT
sẽ khiến trình phân tích cú pháp trả về giá trị khác XNUMX.

Giao thức đến các từ vựng Máy phân tích
Sản phẩm yylex() hàm là một hàm có giá trị số nguyên trả về mã thông báo con số
đại diện cho loại mã thông báo đã đọc. Nếu có một giá trị được liên kết với mã thông báo
trả lại bởi yylex() (xem thảo luận của tag ở trên), nó sẽ được giao cho
nhân tố bên ngoài yylval.

Nếu trình phân tích cú pháp và yylex() không đồng ý về những số mã thông báo này, thông tin liên lạc đáng tin cậy
giữa chúng không thể xảy ra. Đối với các ký tự (ký tự một byte), mã thông báo chỉ đơn giản là
giá trị số của ký tự trong bộ ký tự hiện tại. Các con số cho các mã thông báo khác
có thể được chọn bởi yac, hoặc do người dùng chọn. Trong cả hai trường hợp, #định nghĩa xây dựng
của C được sử dụng để cho phép yylex() để trả về những con số này một cách tượng trưng. Các #định nghĩa báo cáo
được đưa vào tệp mã và tệp tiêu đề nếu tệp đó được yêu cầu. Bộ
các ký tự được cho phép bởi yac trong số nhận dạng lớn hơn giá trị được C. Token cho phép
những tên được tìm thấy có chứa các ký tự như vậy sẽ không được đưa vào #định nghĩa các tờ khai.

Nếu số mã thông báo được chọn bởi yac, các mã thông báo không phải là chữ sẽ được chỉ định
số lớn hơn 256, mặc dù không có thứ tự nào được ngụ ý. Một mã thông báo có thể được chỉ định một cách rõ ràng
một số theo cách xuất hiện đầu tiên của nó trong phần khai báo với một số.
Tên và chữ không được định nghĩa theo cách này vẫn giữ nguyên định nghĩa mặc định của chúng. Tất cả số mã thông báo
được chỉ định bởi yac phải là duy nhất và khác biệt với số mã thông báo được sử dụng cho các ký tự và
mã thông báo do người dùng chỉ định. Nếu số mã thông báo trùng lặp gây ra xung đột trong quá trình tạo trình phân tích cú pháp,
yac sẽ báo cáo một lỗi; nếu không, không xác định được việc gán mã thông báo là
được chấp nhận hoặc một lỗi được báo cáo.

Phần cuối của đầu vào được đánh dấu bằng một mã thông báo đặc biệt được gọi là người đánh dấu, có một mã thông báo
số không hoặc số âm. (Các giá trị này không hợp lệ đối với bất kỳ mã thông báo nào khác.) Tất cả
máy phân tích từ vựng sẽ trả về số XNUMX hoặc số âm dưới dạng số mã thông báo khi đến cuối
đầu vào của họ. Nếu mã thông báo tối đa, nhưng loại trừ, mã đánh dấu tạo thành cấu trúc
khớp với ký hiệu bắt đầu, trình phân tích cú pháp sẽ chấp nhận đầu vào. Nếu con dấu được nhìn thấy trong
bất kỳ bối cảnh nào khác, nó sẽ được coi là một lỗi.

Hoàn thành các chương trình
Ngoài yyparse() và yylex(), chức năng lỗi yy() và chính() được yêu cầu
tạo một chương trình hoàn chỉnh. Ứng dụng có thể cung cấp chính() và lỗi yy(), hoặc chúng
các thói quen có thể đạt được từ yac thư viện.

Yacc Thư viện
Các chức năng sau sẽ chỉ xuất hiện trong yac thư viện có thể truy cập thông qua −l y
toán hạng cho c99; do đó chúng có thể được xác định lại bởi một ứng dụng phù hợp:

int chính(làm mất hiệu lực)
Hàm này sẽ gọi yyparse() và thoát với một giá trị không xác định. Hành động khác
trong chức năng này là không xác định.

int lỗi yy(const xe tăng *s)
Hàm này sẽ ghi đối số được kết thúc bằng NUL thành lỗi chuẩn, theo sau là
Một .

Thứ tự của −l y−l l toán hạng cho c99 là quan trọng; ứng dụng sẽ
hoặc cung cấp của riêng nó chính() chức năng hoặc đảm bảo rằng −l y đi trước −l l.

Gỡ lỗi các Trình phân tích cú pháp
Trình phân tích cú pháp được tạo bởi yac sẽ có các phương tiện chẩn đoán trong đó có thể được tùy chọn
được bật tại thời điểm biên dịch hoặc trong thời gian chạy (nếu được bật tại thời điểm biên dịch). Các
biên dịch mã gỡ lỗi thời gian chạy nằm dưới sự kiểm soát của YYDEBUG, một bộ tiền xử lý
Biểu tượng. Nếu YYDEBUG có giá trị khác XNUMX, mã gỡ lỗi sẽ được đưa vào. Nếu nó
giá trị bằng XNUMX, mã sẽ không được bao gồm.

Trong trình phân tích cú pháp nơi mã gỡ lỗi đã được bao gồm, bên ngoài int yydebug có thể
được sử dụng để bật gỡ lỗi (với giá trị khác XNUMX) và tắt (giá trị XNUMX) trong thời gian chạy. Các
giá trị ban đầu của yydebug sẽ bằng không.

Thời Gian −t được chỉ định, tệp mã sẽ được tạo sao cho, nếu YYDEBUG chưa có
được xác định tại thời điểm biên dịch (sử dụng c99 −D Tùy chọn YYDEBUG chẳng hạn), YYDEBUG sẽ
được đặt rõ ràng thành 1. Khi −t không được chỉ định, tệp mã sẽ được xây dựng sao cho,
nếu YYDEBUG chưa được xác định, nó sẽ được đặt rõ ràng là XNUMX.

Định dạng của đầu ra gỡ lỗi là không xác định nhưng bao gồm ít nhất đủ thông tin
để xác định các hành động thay đổi và giảm bớt, và các ký hiệu đầu vào. Nó cũng cung cấp
thông tin về khôi phục lỗi.

Các thuật toán
Trình phân tích cú pháp được xây dựng bởi yac thực hiện một LALR(1) thuật toán phân tích cú pháp như được ghi trong tài liệu
văn học. Không xác định được trình phân tích cú pháp là hướng theo bảng hay được mã hóa trực tiếp.

Một trình phân tích cú pháp được tạo bởi yac sẽ không bao giờ yêu cầu một ký hiệu đầu vào từ yylex() khi ở trong một
cho biết trong đó các hành động duy nhất khác với hành động lỗi là giảm bớt bởi một quy tắc duy nhất.

Tài liệu của lý thuyết phân tích cú pháp xác định những khái niệm này.

Giới hạn
Sản phẩm yac tiện ích có thể có một số bảng bên trong. Mức tối đa tối thiểu cho các bảng này
được hiển thị trong bảng sau. Ý nghĩa chính xác của những giá trị này là sự triển khai-
được xác định. Việc thực hiện phải xác định mối quan hệ giữa các giá trị này và giữa
chúng và bất kỳ thông báo lỗi nào mà việc triển khai có thể tạo ra nếu nó hết
không gian cho bất kỳ cấu trúc bên trong nào. Việc triển khai có thể kết hợp các nhóm tài nguyên này
vào một nhóm duy nhất miễn là tổng số khả dụng cho người dùng không thấp hơn tổng số
của các kích thước được chỉ định bởi phần này.

Bàn: nội Giới hạn in yac

┌────────────┬────────── ─────┐
│ │ Tối thiểu │ │
Hạn chếtối đaMô tả
├────────────┼────────── ─────┤
│ {NTERMS} │ 126 │ Số lượng mã thông báo. │
│ {NNONTERM} │ 200 │ Số đầu cuối không. │
│ {NPROD} │ 300 │ Số quy tắc. │
│ {NSTATES} │ 600 │ Số trạng thái. │
│ {MEMSIZE} │ 5200 │ Độ dài của các quy tắc. Tổng │
│ │ │ độ dài, trong tên (mã thông báo và │
│ │ │ không phải thiết bị đầu cuối), trong tất cả các │
│ │ │ quy tắc của ngữ pháp. │
│ │ │ phía bên trái được tính cho │
│ │ │ mỗi quy tắc, ngay cả khi nó không phải là │
│ │ │ được lặp lại một cách rõ ràng, như là │
│ │ │ được chỉ định trong Ngữ pháp Nội quy in
│ │ │ yac. │
│ {ACTSIZE} │ 4000 │ Số lượng hành động. `` Hành động '' │
│ │ │ đây (và trong phần mô tả │
│ │ │ tệp) tham chiếu đến các hành động phân tích cú pháp │
│ │ │ (thay đổi, giảm bớt, v.v.) không phải │
│ │ │ đến các hành động ngữ nghĩa được xác định trong │
│ │ │ Ngữ pháp Nội quy in yac. │
└────────────┴────────── ─────┘

EXIT TÌNH TRẠNG


Các giá trị thoát sau sẽ được trả về:

0 Hoàn thành thành công.

> 0 Đã xảy ra lỗi.

HẬU QUẢ OF LRI


Nếu gặp bất kỳ lỗi nào, quá trình chạy sẽ bị hủy bỏ và yac thoát với trạng thái khác không.
Các tệp mã một phần và tệp tiêu đề có thể được tạo ra. Thông tin tóm tắt trong
tệp mô tả sẽ luôn được tạo ra nếu −v cờ có mặt.

Sản phẩm tiếp theo phần đang nhiều thông tin.

ỨNG DỤNG SỬ DỤNG


Các triển khai trong lịch sử trải qua xung đột tên đối với tên yacc.tmp, yacc.acts,
yacc.debug, y.tab.c, y.tab.hy.đầu ra nếu nhiều hơn một bản sao của yac đang chạy trong một
một thư mục tại một thời điểm. Các −b tùy chọn đã được thêm vào để khắc phục sự cố này. Các
vấn đề liên quan đến việc cho phép nhiều yac phân tích cú pháp được đặt trong cùng một tệp là
giải quyết bằng cách thêm một −p tùy chọn ghi đè lên mã cứng trước đó yy tiền tố biến.

Mô tả của −p tùy chọn chỉ định tập hợp tối thiểu của hàm và tên biến
gây ra xung đột khi nhiều trình phân tích cú pháp được liên kết với nhau. YYSTYPE không cần phải
đã thay đổi. Thay vào đó, lập trình viên có thể sử dụng −b để cung cấp các tệp tiêu đề cho các trình phân tích cú pháp khác nhau
các tên khác nhau và sau đó là tệp có yylex() cho một trình phân tích cú pháp nhất định có thể bao gồm
tiêu đề cho trình phân tích cú pháp đó. Những cái tên như yyclearer không cần phải thay đổi bởi vì chúng
chỉ được sử dụng trong các hành động; chúng không có liên kết. Có thể là một
triển khai có các tên khác, hoặc là tên nội bộ để triển khai những thứ, chẳng hạn như
yyclearerhoặc cung cấp các tính năng không chuẩn mà nó muốn thay đổi −p.

Các toán tử đơn nguyên có cùng mã thông báo với toán tử nhị phân nói chung cần
mức độ ưu tiên đã được điều chỉnh. Điều này được xử lý bởi % Pre biểu tượng tư vấn được liên kết với
quy tắc ngữ pháp cụ thể xác định toán tử một ngôi đó. (Nhìn thấy Ngữ pháp Nội quy in yac.)
Các ứng dụng không bắt buộc phải sử dụng toán tử này cho các toán tử một ngôi, nhưng các văn phạm
mà không yêu cầu nó là hiếm.

VÍ DỤ


Truy cập vào yac thư viện có được với các toán hạng tìm kiếm thư viện để c99. Để sử dụng
yac thư viện chính():

c99 y.tab.c −l y

Cả hai lex thư viện và yac thư viện chứa chính(). Để truy cập yac chính():

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

Điều này đảm bảo rằng yac thư viện được tìm kiếm đầu tiên, do đó chính() Được sử dụng.

Lịch sử yac thư viện chứa hai hàm đơn giản thường được mã hóa
bởi người lập trình ứng dụng. Các chức năng này tương tự như đoạn mã sau:

#include
int chính (vô hiệu)
{
bên ngoài int yyparse ();

setlocale (LC_ALL, "");

/ * Nếu trình phân tích cú pháp sau được tạo bởi lex,
ứng dụng phải cẩn thận để đảm bảo rằng LC_CTYPE
và LC_COLLATE được đặt thành ngôn ngữ POSIX. * /
(void) yyparse ();
trả về (0);
}

#bao gồm

int yyerror (const char * msg)
{
(void) fprintf (stderr, "% s \ n", msg);
trả về (0);
}

CƠ SỞ LÝ LUẬN


Các tài liệu tham khảo trong Được tham chiếu Tài liệu có thể hữu ích trong việc xây dựng trình phân tích cú pháp
máy phát điện. Bài báo tham khảo của DeRemer và Pennello (cùng với các tác phẩm
tham chiếu) mô tả một kỹ thuật để tạo trình phân tích cú pháp phù hợp với tập này của
POSIX.1‐2008. Công việc trong lĩnh vực này vẫn tiếp tục được thực hiện, vì vậy những người thực hiện nên tham khảo
văn học hiện tại trước khi thực hiện bất kỳ triển khai mới nào. Bài báo gốc của Knuth là
cơ sở lý thuyết cho loại trình phân tích cú pháp này, nhưng các bảng mà nó tạo ra là không thực tế
lớn cho những ngữ pháp hợp lý và không nên sử dụng. Từ ngữ `` tương đương với '' là
cố ý đảm bảo rằng các bảng tốt nhất LALR(1) có thể được tạo ra.

Đã có sự nhầm lẫn giữa các loại ngữ pháp, các thuật toán cần thiết để tạo ra
trình phân tích cú pháp và các thuật toán cần thiết để phân tích cú pháp các ngôn ngữ. Tất cả đều hợp lý
trực giao. Đặc biệt, một trình tạo phân tích cú pháp chấp nhận toàn bộ phạm vi LR(1)
các nhà ngữ pháp không cần tạo một bảng phức tạp hơn một bảng chấp nhận SLR(1) (một
lớp ngữ pháp LR tương đối yếu) đối với một ngữ pháp xảy ra SLR(1). Như một
thực hiện cũng không cần phải công nhận trường hợp; nén bảng có thể mang lại SLR(1)
bảng (hoặc thậm chí nhỏ hơn bảng đó) mà không nhận ra rằng ngữ pháp là SLR(1). Các
tốc độ của một LR(1) phân tích cú pháp cho bất kỳ lớp nào phụ thuộc nhiều hơn vào biểu diễn bảng và
nén (hoặc tạo mã nếu một trình phân tích cú pháp trực tiếp được tạo) so với lớp
ngữ pháp mà trình tạo bảng xử lý.

Tốc độ của trình phân tích cú pháp phần nào phụ thuộc vào loại ngữ pháp mà nó
tay cầm. Tuy nhiên, các thuật toán bài viết Knuth ban đầu để xây dựng bộ phân tích cú pháp LR là
được tác giả của nó đánh giá là chậm một cách phi thực tế vào thời điểm đó. Mặc dù LR đầy đủ hơn
phức tạp hơn LALR(1), khi tốc độ máy tính và thuật toán cải thiện, sự khác biệt (về
thời gian thực thi đồng hồ treo tường có thể chấp nhận được) ngày càng trở nên ít đáng kể.

Các tác giả tiềm năng được cảnh báo rằng bài báo được tham khảo của DeRemer và Pennello
được trích dẫn trước đó xác định một lỗi (đơn giản hóa quá mức tính toán của LALR(1)
bộ lookahead) trong một số LALR(1) các câu lệnh thuật toán trước nó
sự xuất bản. Họ nên dành thời gian để tìm hiểu bài báo đó, cũng như các tài liệu hiện tại có liên quan
làm việc, đặc biệt là của Aho.

Sản phẩm −b tùy chọn đã được thêm vào để cung cấp một phương pháp di động để cho phép yac làm việc ở
nhiều trình phân tích cú pháp riêng biệt trong cùng một thư mục. Nếu một thư mục chứa nhiều hơn một
yac ngữ pháp và cả hai ngữ pháp được xây dựng cùng một lúc (ví dụ:
song song, tương đông làm cho chương trình), kết quả xung đột. Mặc dù giải pháp không phải là thực tiễn lịch sử,
nó sửa chữa sự thiếu sót đã biết trong quá trình triển khai trước đây. Các thay đổi tương ứng là
được thực hiện cho tất cả các phần tham chiếu đến tên tệp y.tab.c (bây giờ là `` tệp mã ''),
y.tab.h (bây giờ là `` tệp tiêu đề ''), và y.đầu ra (bây giờ là `` tệp mô tả '').

Ngữ pháp cho yac đầu vào dựa trên tài liệu Hệ thống V. Mô tả văn bản
cho thấy ở đó ';' là bắt buộc ở cuối quy tắc. Ngữ pháp và
thực hiện không yêu cầu điều này. (Việc sử dụng C_IDENTIFIER gây ra giảm xảy ra trong
đúng địa chỉ.)

Ngoài ra, trong quá trình triển khai đó, các cấu trúc như %mã thông báo có thể được kết thúc bởi một
, nhưng điều này không được ngữ pháp cho phép. Các từ khóa như %mã thông báo có thể
cũng xuất hiện ở dạng chữ hoa, điều này một lần nữa không được thảo luận. Ở hầu hết những nơi mà '%' Được sử dụng,
có thể được thay thế và có các cách viết thay thế cho một số ký hiệu
(ví dụ, %BÊN TRÁI có thể "% <" hoặc thậm chí "\ <").

Trong lịch sử,tag> có thể chứa bất kỳ ký tự nào ngoại trừ '>', bao gồm cả khoảng trắng, trong
thực hiện. Tuy nhiên, kể từ khi tag phải tham chiếu đến một thành viên công đoàn tiêu chuẩn ISO C, trong
triển khai tuân thủ thực hành chỉ cần hỗ trợ tập hợp các ký tự cho ISO C
định danh tiêu chuẩn trong ngữ cảnh này.

Một số triển khai lịch sử được biết là chấp nhận các hành động được chấm dứt bởi
giai đoạn = Stage. Các triển khai trong lịch sử thường cho phép '$' trong tên. Một triển khai phù hợp
không cần hỗ trợ một trong hai hành vi này.

Quyết định khi nào sử dụng % Pre minh họa khó khăn trong việc xác định hành vi của yac.
Có thể có những tình huống trong đó ngữ pháp không phải, nói đúng ra là do lỗi, nhưng
yac không thể giải thích nó một cách rõ ràng. Việc giải quyết những điểm mơ hồ trong ngữ pháp có thể
trong nhiều trường hợp được giải quyết bằng cách cung cấp thông tin bổ sung, chẳng hạn như sử dụng %kiểu or
%liên hiệp các bản kê khai. Nó thường dễ dàng hơn và nó thường mang lại một trình phân tích cú pháp nhỏ hơn để thực hiện
sự thay thế này khi nó thích hợp.

Kích thước và thời gian thực thi của một chương trình được tạo ra mà không có mã gỡ lỗi thời gian chạy là
thường nhỏ hơn và nhanh hơn một chút trong các triển khai trước đây.

Thông báo thống kê từ một số triển khai lịch sử bao gồm các loại sau:
thông tin:

n/ 512 thiết bị đầu cuối, n/ 300 không thiết bị đầu cuối
n/ 600 quy tắc ngữ pháp, n/ 1500 tiểu bang
n thay đổi / giảm bớt, n giảm / giảm xung đột được báo cáo
n/ 350 bộ làm việc được sử dụng
Bộ nhớ: trạng thái, v.v. n/ 15000, trình phân tích cú pháp n/ 15000
n/ 600 bộ lookahead riêng biệt
n đóng thêm
n mục thay đổi, n trường hợp ngoại lệ
n mục goto
n các mục nhập được lưu theo mặc định của goto
Không gian trình tối ưu hóa được sử dụng: đầu vào n/ 15000, đầu ra n/ 15000
n mục bảng, n không
Mức chênh lệch tối đa: n, Bù đắp tối đa: n

Báo cáo của các bảng nội bộ trong tệp mô tả được để lại phần triển khai xác định
bởi vì tất cả các khía cạnh của các giới hạn này cũng được xác định bởi việc triển khai. Một số triển khai
có thể sử dụng kỹ thuật phân bổ động và không có giá trị giới hạn cụ thể để báo cáo.

Định dạng của y.đầu ra tệp không được cung cấp vì đặc điểm kỹ thuật của định dạng không
được thấy để nâng cao tính di động của ứng dụng. Danh sách này chủ yếu nhằm giúp con người
người dùng hiểu và gỡ lỗi trình phân tích cú pháp; sử dụng y.đầu ra bởi một tập lệnh ứng dụng phù hợp
sẽ là bất thường. Hơn nữa, việc triển khai không tạo ra đầu ra nhất quán và không
định dạng phổ biến đã rõ ràng. Định dạng được lựa chọn bởi triển khai phải là con người-
có thể đọc được, ngoài yêu cầu đó là tệp văn bản.

Các báo cáo lỗi tiêu chuẩn không được mô tả cụ thể vì chúng hiếm khi được sử dụng để
ứng dụng phù hợp và không có lý do gì để hạn chế việc triển khai.

Một số triển khai nhận ra "= {" tương đương với '{' bởi vì nó xuất hiện trong lịch sử
tài liệu. Công trình xây dựng này đã được ghi nhận và ghi nhận là đã lỗi thời từ lâu vì
1978, trong tài liệu tham khảo Yacc: Chưa Một Trình biên dịch. Khối lượng này của POSIX.1‐2008
đã chọn để nó lỗi thời và bỏ qua nó.

Các ký tự nhiều byte phải được bộ phân tích từ vựng nhận dạng và trả về dưới dạng mã thông báo.
Chúng không được trả về dưới dạng các ký tự nhiều byte. Mã thông báo lôi cái đó được sử dụng
để khôi phục lỗi thường được gán giá trị 256 trong quá trình triển khai lịch sử.
Do đó, giá trị mã thông báo 256, được sử dụng trong nhiều bộ ký tự nhiều byte, không
có sẵn để sử dụng làm giá trị của mã thông báo do người dùng xác định.

TƯƠNG LAI HƯỚNG DẪN


Không có.

Sử dụng yaccposix trực tuyến bằng các dịch vụ onworks.net


Máy chủ & Máy trạm miễn phí

Tải xuống ứng dụng Windows & Linux

  • 1
    itop - ITSM CMDB OpenSource
    itop - Nguồn mở ITSM CMDB
    Cổng hoạt động CNTT: hoàn toàn mở
    nguồn, ITIL, dịch vụ dựa trên web
    công cụ quản lý bao gồm đầy đủ
    CMDB có thể tùy chỉnh, hệ thống trợ giúp và
    một người đàn ông tài liệu ...
    Tải xuống itop - ITSM CMDB OpenSource
  • 2
    Clementine
    Clementine
    Clementine là một bản nhạc đa nền tảng
    người chơi và tổ chức thư viện lấy cảm hứng từ
    Amarok 1.4. Nó có một tốc độ nhanh và
    giao diện dễ sử dụng và cho phép bạn
    tìm kiếm và...
    Tải xuống Clementine
  • 3
    XISMuS
    XISMuS
    CHÚ Ý: Bản cập nhật tích lũy 2.4.3 có
    đã được phát hành !! Bản cập nhật hoạt động cho bất kỳ
    phiên bản 2.xx trước đó. Nếu nâng cấp
    từ phiên bản v1.xx, vui lòng tải xuống và
    i ...
    Tải xuống XISMuS
  • 4
    facetracknoir
    facetracknoir
    Chương trình theo dõi mô-đun
    hỗ trợ nhiều trình theo dõi khuôn mặt, bộ lọc
    và giao thức trò chơi. Trong số những người theo dõi
    là SM FaceAPI, AIC Inertial Head
    Trình theo dõi ...
    Tải xuống facetracknoir
  • 5
    Mã QR PHP
    Mã QR PHP
    PHP QR Code là mã nguồn mở (LGPL)
    thư viện để tạo mã QR,
    Mã vạch 2 chiều. Dựa trên
    thư viện libqrencode C, cung cấp API cho
    tạo mã QR mã vạch ...
    Tải xuống mã QR PHP
  • 6
    freeciv
    freeciv
    Freeciv là một trò chơi miễn phí theo lượt
    trò chơi chiến lược nhiều người chơi, trong đó mỗi
    người chơi trở thành lãnh đạo của một
    nền văn minh, chiến đấu để đạt được
    mục tiêu cuối cùng: trở thành ...
    Tải xuống Freeciv
  • Khác »

Lệnh Linux

Ad