2013-05-29 24 views
5

Tôi đang thực hiện một phân tích từ vựng cơ bản trong Java cho dự án học kỳ của tôi và tôi xung đột về một khái niệm với giáo viên môn học của tôi.Có phải chuỗi "1a" là lỗi cho máy phân tích từ vựng hay không?

Quan điểm của tôi là nói chung nếu một đầu vào như "1a" được trao cho phân tích từ vựng sau đó nó sẽ cho đầu ra như:

"<Number><Identifier>"

Nhưng, giáo viên của tôi nói rằng nó nên lá cờ này như là một lỗi bởi vì thay vì xử lý nó như là một số và một định danh nó nên gắn cờ toàn bộ chuỗi (tức là "1a") như là một error.This là bởi vì (như ông nói) định danh không thể bắt đầu với một số.

Ngược lại, tôi nghĩ rằng đây phải là trách nhiệm của giai đoạn tiếp theo của trình biên dịch (trình phân tích cú pháp) để quyết định xem có điều gì đó là một định danh hợp lệ hay không. Tôi biết anh ta đúng về các số nhận dạng không bắt đầu bằng một con số nhưng tôi cần phải đóng cửa trên phần mà người phân tích từ vựng phải là người quyết định điều đó.

Tôi thực sự sẽ đánh giá cao sự trợ giúp của bạn. Cảm ơn bạn

Trả lời

3

Trình phân tích từ vựng phải xử lý loại thẻ nào là hợp pháp hay không và chia văn bản thành mã thông báo. Nó sẽ lỗi nếu một chuỗi không thể tạo thành một mã thông báo hợp lệ.

Trình phân tích cú pháp chỉ đề cập đến cấu trúc của chương trình khi mã thông báo đã được xác định. Nó sẽ đưa ra một lỗi nếu các mã thông báo không thể được phân tích cú pháp theo ngữ pháp đã cho.

Vì vậy, giáo viên của bạn là chính xác. Xác định xem một định danh là hợp pháp thuộc phân tích từ vựng.

+0

Tại sao không thể phân tích từ vựng đọc '1' và sau đó dừng lại ở 'a' flag '1' làm số và sau đó bắt đầu lại và sau đó đọc 'a' và gắn cờ làm số nhận dạng. Không phải là 'một' một tách biệt ở đây cho NFA mà đề với các con số? – Cheeta

+0

Tôi muốn nói mã thông báo xảy ra với các dấu phân tách được xác định trước, thường là với dấu cách. Đối với trình phân tích từ vựng để tách chuỗi thành 1 và chúng ta cần xác định các quy tắc bổ sung để thực hiện việc này. Tôi nghĩ rằng những gì giáo viên của bạn có trong tâm trí là 1a là một trong những mã thông báo và vì nó không phù hợp với một biểu thức chính quy cho một định danh, các phân tích từ vựng sẽ đưa ra một lỗi. –

+0

Tùy thuộc vào cách phân tích từ vựng được viết. Sử dụng flex nó thực sự là rất dễ dàng để tạo ra một phân tích từ vựng mà sẽ phân tích 1a như một số theo sau là một định danh. – Eelke

-1

tôi không thể cung cấp đầu vào những câu hỏi philosphy-of-lexicons, nhưng tôi có thể cung cấp một câu trả lời cho cách bạn nên mã dự án của bạn:

Mã nó như ông gợi ý nếu bạn muốn để có được một A.

+0

Tôi cho rằng rất tốt để tranh luận, ngay cả khi bạn kết thúc sai hoặc ý kiến ​​của bạn không khớp với thông số kỹ thuật của dự án. Chúng ta có thể học được bằng cách nào khác? Downvoted vì đây là một câu trả lời thực sự không cần thiết, và nên có được một bình luận nếu nói ở tất cả. –

0

Lý do cho điều này là ngôn ngữ thường sử dụng mã bưu chính trên các số, như 1L trong C là giá trị 1 của loại dài thay vì loại mặc định int. Ngoài ra, bạn muốn có thể thêm postfix sau này trong một ngôn ngữ. Hãy xem xét 1a của bạn. Đầu tiên điều này sẽ được phân tích cú pháp là int value 1 theo sau bởi một định danh a. Nhưng bây giờ người sáng tạo trình biên dịch của bạn quyết định bắt đầu sử dụng như một postfix trên các số. Đột nhiên 1a trở thành một mã thông báo duy nhất.

Đối với 1a cũng có trường hợp đặc biệt là 1a có thể có nghĩa là số thập lục phân nhưng bạn quên đặt postfix/tiền tố bắt buộc 0x1a cho C hoặc 1ah cho các phiên bản lắp ráp nhất định.

0

Phát hiện điều này trong trình phân tích cú pháp sẽ chỉ hoạt động đối với ngữ pháp trong đó một số được theo sau bởi số nhận dạng xảy ra không hợp lệ về cú pháp. Nếu 1 a là cú pháp hợp lệ trong ngôn ngữ của bạn, bạn sẽ để xử lý điều này trong lexer vì trình phân tích cú pháp không thể phân biệt giữa 1a (không có khoảng trắng) và 1 a (với khoảng trắng).

Tại sao không thực hiện việc này trong lexer? Công việc của người làm lexer là làm cho công việc của trình phân tích cú pháp dễ dàng hơn. Bất kỳ công việc nào nó có thể làm để đơn giản hóa trình phân tích cú pháp của bạn mà không cần thêm nhiều phức tạp cho chính nó là một ý tưởng hay.

Các vấn đề liên quan