2012-11-09 35 views
5

Tôi đang cố viết một ngữ pháp ANTLR cho một ngôn ngữ truy vấn nhỏ. Truy vấn là một danh sách các thuật ngữ tìm kiếm giới hạn trong các lĩnh vực cụ thể:Bắt tất cả thay thế thứ hai cho quy tắc bắt đầu của tôi

field1: a field2: field3 b: c

Đó là nghĩa vụ phải trả lại một danh sách các đơn vị nơi field1 phù hợp với, field2 phù hợp b, và vân vân. Truy vấn cũng có thể hoàn toàn không hạn chế:

abc

Đó là nghĩa vụ phải trở về đơn vị với bất kỳ lĩnh vực phù hợp với abc. Đây là ngữ pháp ANTLR:

@members { 
    String unrestrictedQuery; 
} 

FIELD1_OPERATOR: 'field1:'; 
FIELD2_OPERATOR: 'field2:'; 
FIELD3_OPERATOR: 'field3:'; 
DIGIT: '0'..'9'; 
LETTER: 'A'..'Z' | 'a'..'z'; 

query: subquery (' ' subquery)* 
    | UNRESTRICTED_QUERY=.* {unrestrictedQuery = $UNRESTRICTED_QUERY.text;} 
    ; 

Tôi muốn các truy vấn không bị giới hạn là bất kỳ văn bản nào không khớp với giải pháp thay thế đầu tiên của quy tắc truy vấn.

1) Có cách nào tốt hơn để lấy văn bản thay thế thứ hai khớp không?

2) Khi tôi cắm điều này vào máy chủ web của tôi, trường phân tích cú pháp không hạn chế sẽ phân giải thành ký tự cuối cùng của truy vấn. Dường như hành động được gọi cho mọi ký tự của truy vấn khi tôi thực sự muốn toàn bộ chuỗi.

Cảm ơn bạn đã đọc!

+1

Lệnh '*' trong 'UNRESTRICTED_QUERY = *' phù hợp với bất kỳ số lượng thẻ. Nó * không * khớp với bất kỳ số lượng ký tự nào! Sự khác biệt lớn. –

+0

Bạn hoàn toàn đúng. Cảm ơn bạn. –

Trả lời

1

"Tôi muốn truy vấn không bị giới hạn là bất kỳ văn bản nào không khớp với thay thế đầu tiên của quy tắc truy vấn". Đây là một quyết định thiết kế tồi. Điều gì sẽ xảy ra nếu trong tương lai, bạn muốn thêm Field4? Sau đó, không tương thích xảy ra. Thay đổi ngữ pháp tốt hơn để các truy vấn không hạn chế dễ dàng được nhận ra. giá trị trường Surround (a, b, c) với dấu ngoặc kép, hoặc bắt đầu truy vấn không hạn chế với một dấu hai chấm:..

field1:a :abc field2:b 
Các vấn đề liên quan