2013-05-30 22 views
6

Tôi khá mới với Xtext, vì vậy tôi không hiểu rõ tất cả các khái niệm liên quan. Có một câu hỏi đặc biệt tôi không thể tìm thấy câu trả lời cho:
làm cách nào để quản lý ngữ pháp cho một ngôn ngữ có nhiều tệp?
Xtext - nhiều tệp ngôn ngữ

DSL tôi đang làm việc thường sử dụng bốn tệp, ba trong số đó phải được tham chiếu trong tệp đầu tiên. Tất cả các tệp chia sẻ cùng một phần mở rộng, mặc dù không cùng ngữ pháp. Liệu có thể không?

Trả lời

6

Làm cách nào để quản lý ngữ pháp cho ngôn ngữ có nhiều tệp?

Xtext đầu tiên phân tích cú pháp tệp và sau đó liên kết chéo. Các giao thoa này có thể là "nội bộ" trong một tệp hoặc "bên ngoài". Trong cả hai trường hợp, linkingscoping ystems sẽ thực hiện công việc khó khăn cho bạn.

Tất cả các tệp chia sẻ cùng một phần mở rộng, mặc dù không cùng ngữ pháp. Liệu có thể không?

Điều này dường như là một câu hỏi khác nhau, nhưng than ôi ...

Nếu văn phạm thực sự khác nhau sau đó bạn sẽ có một thời gian khó khăn với Xtext. Nếu Xtext thấy tệp .foo, nó nên quyết định như thế nào, trình phân tích cú pháp nào nên được áp dụng? Hãy thử mỗi một cho đến khi không có lỗi xảy ra? Và nếu tập tin được viết bằng ngữ pháp B nhưng thực sự có lỗi cú pháp thì sao? ...

Nhưng thường có một mẹo nhỏ: Thực sự là một ngữ pháp, nhưng ngữ pháp chứa hai phần gần như riêng biệt. Phần nào được sử dụng được tính bằng một vài từ khóa đầu tiên trong tệp.

Một ví dụ nhỏ:

file A.foo:

module A { 
    // more stuff here 
} 
module B { 
    // also more stuff 
} 

file B.foo:

system X { 
    use module A 
    use module B 
} 

Ngữ pháp có thể trông như thế này:

Model: Modules | Systems; 

Modules: modules += Module; 
Module: 'module' name=ID '{' '}'; 

Systems: systems += System; 
System: 'system' name=ID '{' used+=UsedModule* '}'; 
UsedModule: 'use' 'module' module=[Module]; 

Trong ngữ pháp này, một tập tin có thể được bật y chứa các định nghĩa module XOR system nhưng không phải là kết hợp của chúng. Lần xuất hiện đầu tiên của từ khóa module hoặc system xác định những gì được cho phép.