2013-08-22 25 views
5

Sau đây là những quy tắc ngữ pháp của tôi:cách nhận vị trí (# dòng) của EObject trong tài liệu gốc?

Stmts: (stmts += Stmt ';')* ; 
Stmt: Stmt1 | Stmt2 | Stmt3 ... ; 

Tôi muốn biết mỗi stmt # là # -thứ stmt trong stmts và chính xác vị trí của họ (# -thứ dòng trong tài liệu gốc). Như vậy tôi có thể chỉ ra vị trí khi người dùng mắc lỗi.

Tôi ghi đè trình xây dựng trình xác thực và lưu trữ HashMap <Stmt, Integer> để nhận được mỗi Stmt # là #-Stmt in stmts (Không chắc chắn nếu đây là cách chính xác để thực hiện ...). Tuy nhiên tôi không có ý tưởng làm thế nào để có được số dòng của họ.

Bất kỳ trợ giúp nào?

Trả lời

4

Cho một EObject bạn có thể dễ dàng lấy vị trí trong tệp nguồn bằng cách sử dụng org.eclipse.xtext.nodemodel.util.NodeModelUtils.getNode(EObject).

Ví dụ:

INode node = NodeModelUtils.getNode(o); 
    System.out.println(String.format("Node goes from line %s to line %s",node.getStartLine(), node.getEndLine())); 
+0

Nếu tôi đặt dòng đầu tiên trong bất kỳ phương pháp chú thích @Check tôi sẽ nhận được '- biểu hiện này không được phép trong bối cảnh này, vì nó không gây bất kỳ tác dụng phụ .', tôi đã làm sai ở đâu? –

+0

Tôi không biết @Check chú thích nào bạn đã đặt ở đây, nhưng tôi nghĩ tôi có thể giải thích thông báo lỗi. Nếu bạn chỉ đặt dòng đầu tiên vào, bạn chỉ đọc một giá trị, nhưng không thay đổi gì cả. Vì vậy, việc đọc là vô nghĩa, nếu bạn không làm bất cứ điều gì với giá trị bạn đọc. Đặt cả hai dòng và lỗi sẽ biến mất. –

+0

Tôi biết chuyện gì đã xảy ra ... Tôi đang sử dụng xtext 2.4 và ngôn ngữ mặc định của trình xác thực xtext là xtend chứ không phải java. Dòng đầu tiên trong xtend phải là 'val INode node = NodeModelUtils.getNode (o);' Cảm ơn bạn Stefan, đó là chính xác những gì tôi muốn. –

0

Để chỉ ra các lỗi đơn giản chỉ cần viết trình xác nhận khai báo phù hợp hơn - trong trường hợp đó, bạn chỉ cần cung cấp cho EObject có vấn đề Xtext và quản lý để theo dõi nó trở lại nguồn. Hơn nữa, một trình xác nhận hợp lệ được tạo ra trong dự án ngôn ngữ của bạn.

Tuy nhiên, nếu bạn cần theo dõi thủ công các nút, có thể tiêm ILocationInFileProvider có thể giúp bạn.

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