2012-02-05 46 views
8

Dòng sau làm gì?#line có nghĩa là gì?

#line 25 "CSSGrammar.y" 

Và tiện ích mở rộng là gì?

+0

Chỉ cần tò mò ... Trình biên dịch nào thực hiện việc này? – Vyktor

+0

@Vyktor Tôi đang sử dụng MSVS2008. –

+1

@Vyktor là một phần của tiêu chuẩn –

Trả lời

11

Theo tiêu chuẩn:

§16.4.3:

Một chỉ thị tiền xử lý của mẫu

# line digit-sequence new-line 

làm cho thực hiện để hành xử như thể trình tự sau đây của dòng nguồn bắt đầu với một dòng nguồn có một số dòng như được chỉ định bởi chuỗi chữ số (được hiểu là số nguyên thập phân). Nếu dãy số chỉ định 0 hoặc số lớn hơn 2147483647, hành vi không xác định.

§16.4.4:

Một chỉ thị tiền xử lý của mẫu

# line digit-sequence " s-char-sequenceopt" new-line 

đặt số dòng coi tương tự và thay đổi tên cho là của tập tin nguồn được nội dung của chuỗi ký tự bằng chữ.

§16.4.5:

Một chỉ thị tiền xử lý của mẫu

# line pp-tokens new-line 

(mà không phù hợp với một trong hai hình thức trước đó) được phép. Các mã thông báo tiền xử lý sau dòng trên chỉ thị được xử lý giống như trong văn bản thông thường (mỗi mã định danh hiện được định nghĩa là tên macro là được thay thế bằng danh sách thay thế mã thông báo tiền xử lý). Nếu chỉ thị kết quả sau khi tất cả các thay thế không khớp với một trong hai hình thức trước đó, hành vi này là không xác định; nếu không, kết quả sẽ được xử lý nếu thích hợp.

Việc gia hạn .y là chỉ là những gì tác giả đã chọn để sử dụng, có lẽ để làm cho nó rõ ràng rằng đó là một tập tin YACC (từ "ngữ pháp" cũng chỉ ra rằng mặc dù nó chỉ là một phỏng đoán).

2

Trình tạo trình phân tích cú pháp 'yacc' tiêu thụ các tệp kết thúc bằng .y và phát ra các tệp có chứa c hoặc C++. Nó thêm các dòng #line này để cho phép trình gỡ lỗi lấy lại nguồn gốc cũ, không chấp nhận thay thế.

7

Đơn giản chỉ ra rằng dòng mã hiện tại được lấy từ dòng 25 của CSSGrammar.y, một tệp ngữ pháp kiểu YACC là nơi mã này được tạo.

Điều này có thể được các trình gỡ rối sử dụng để tự mình bước vào ngữ pháp thay vì mã được tạo.

+2

Không chỉ cho các trình gỡ rối: nó còn giúp các trình biên dịch đưa bạn đến đúng nguồn lỗi. –

1

đó là tùy chọn tiền xử lý c. Nó yêu cầu trình phân tích cú pháp c giảm số lượng dòng của tệp nguồn là một giả vờ, rằng đây là dòng # 25.

Với thông tin này, bạn dễ dàng gỡ lỗi tệp nguồn hơn. Tệp yacc sẽ được dịch sang nguồn c, đây là dòng nguồn giả vờ.

1

Nó chỉ thị cho trình biên dịch tin rằng dòng sau là dòng số 25 trong tệp CSSGrammar.y. Sau đó, nếu một lỗi được phát hiện bởi trình biên dịch trên dòng tiếp theo 2, nó sẽ được báo cáo là đến từ dòng 26 của CSSGrammar.y

Chương Trình tạo ra các tệp C, như bison, hoặc yacc, hoặc flex, hoặc ANTLR, hoặc thậm chí MELT sử dụng khả năng đó rất nhiều.

Nếu thông tin gỡ lỗi được tạo (ví dụ: gcc -g), nó sẽ trỏ đến tệp CSSGrammar.y trong ví dụ của bạn.

4

#line chỉ thị sửa đổi vị trí báo cáo cho trình biên dịch và được sử dụng bởi phần mềm tạo mã để giúp người lập trình xác định vấn đề trong nguồn ban đầu. Nó có thể được sử dụng bởi bất cứ ai để giúp chuyển hướng báo cáo lỗi được nhiều thông tin hơn. Vì vậy, ví dụ như trình phân tích cú pháp của bạn tạo ra một tệp CSSGrammar.cpp nói, được biên dịch bởi trình biên dịch C++, và có đoạn trích C++ trong đó, chỉ thị #line 25 "CSSGrammar.y" báo cho trình biên dịch C++ xử lý điểm cụ thể đó trong tệp như thể nó là dòng số 25 từ CSSGrammar.y

Trình biên dịch sẽ tiếp tục phân tích các dòng tiếp theo và báo cáo lỗi trong điều kiện ban đầu của chỉ thị đó.

Vì vậy, nếu một lỗi xảy ra 3 dòng sau nó sẽ báo cáo rằng một lỗi xảy ra trên đường dây 28 trong CSSGrammar.y

Lưu ý rằng một tập tin nguồn duy nhất có thể có nguồn đến từ nhiều phần; và rằng chỉ thị này có thể được sử dụng khá hiệu quả để chỉ ra các điều kiện lỗi.

Thông thường bạn sẽ thấy rằng có nhiều chỉ thị #line trên đường đi; họ chỉ ở đó để giải thích cho các loại tiêm khác nhau trên đường đi (để đặt lại dấu nháy báo cáo nếu bạn muốn).

Lưu ý rằng chỉ thị #line có thể được sử dụng bởi BẤT CỨ máy phát điện bao gồm máy phát của riêng bạn và không giới hạn ở bất kỳ trình tạo trình phân tích cú pháp nào.