2010-03-23 37 views
8

sự khác biệt giữa ngữ pháp này là gì:ANTLR ngữ pháp: parser- và lexer literals

... 
if_statement : 'if' condition 'then' statement 'else' statement 'end_if'; 
... 

và điều này:

... 
if_statement : IF condition THEN statement ELSE statement END_IF; 
... 

IF : 'if'; 
THEN: 'then'; 
ELSE: 'else'; 
END_IF: 'end_if'; 
.... 

?

Nếu có bất kỳ sự khác biệt, như tác động này trên hiệu suất ... Cảm ơn

Trả lời

1

Sự khác biệt duy nhất là trong quy tắc sản xuất đầu tiên của bạn, các thẻ từ khóa được định nghĩa ngầm. Không có hàm ý hiệu suất thời gian chạy cho các mã thông báo được xác định ngầm định và rõ ràng.

8

Ngoài câu trả lời của Will, tốt nhất bạn nên xác định mã thông báo lexer của mình một cách rõ ràng (trong ngữ pháp ngôn ngữ của bạn). Trong trường hợp bạn đang trộn chúng trong ngữ pháp phân tích cú pháp của bạn, nó không phải luôn luôn rõ ràng trong những thứ tự các thẻ được tokenized bởi lexer. Khi xác định chúng một cách rõ ràng, chúng luôn được mã hóa theo thứ tự chúng đã được đưa vào ngữ pháp từ vựng (từ trên xuống dưới).

2

Sự khác biệt lớn nhất là sự khác biệt có thể không quan trọng đối với bạn. Nếu quy tắc Lexer của bạn nằm trong lexer thì bạn có thể sử dụng thừa kế để có nhiều người chia sẻ một tập hợp các quy tắc từ vựng chung.

Nếu bạn chỉ sử dụng chuỗi trong quy tắc phân tích cú pháp của mình thì bạn không thể thực hiện việc này. Nếu bạn không bao giờ có kế hoạch tái sử dụng ngữ pháp lexer của bạn thì lợi thế này không quan trọng. Ngoài ra tôi, và tôi đoán hầu hết các cựu chiến binh Antlr, quen với việc tìm kiếm các quy tắc lexer trong ngữ pháp thực tế hơn là trộn lẫn với ngữ pháp phân tích cú pháp, vì vậy người ta có thể cho rằng khả năng đọc được tăng lên bằng cách đặt các quy tắc trong lexer.

Không có tác động hiệu suất thời gian chạy sau khi trình phân tích cú pháp Antlr được xây dựng theo một trong hai cách tiếp cận.

0

Tuy nhiên, một sự khác biệt: khi bạn xác định rõ ràng quy tắc lexer của mình, bạn có thể truy cập chúng thông qua tên bạn đã cung cấp cho chúng (ví dụ: khi bạn cần kiểm tra loại mã thông báo cụ thể). Nếu không thì ANTLR sẽ sử dụng các số tùy ý (với tiền tố).