2012-01-19 49 views
6

Với ngữ pháp Parsekit đơn giản.Tự động hoàn thành Parsekit

@start = sentence+; 
sentence = 'beer' container; 
container = 'bottle' | 'cup'; 

Nếu tôi có phân tích từng phần beer có thể yêu cầu Parsekit trả lại số lần hoàn thành có thể cho câu không?

Trả lời

4

Nhà phát triển của ParseKit tại đây.

Thật không may, không có cơ chế "miễn phí" trong ParseKit sẽ tự trả lại dữ liệu này.

Tuy nhiên, đây chính xác là loại nhiệm vụ mà ParseKit được thiết kế/phù hợp với. Nhưng bạn phải tự viết một số mã. Một cái gì đó như thế này sẽ hoạt động:

Đầu tiên, hãy thay đổi ngữ pháp một chút để bao gồm một sản phẩm được đặt tên theo số 'beer'. Điều này sẽ giúp việc triển khai gọi lại dễ dàng hơn:

@start = sentence+; 
sentence = beer container; 
beer = 'beer'; 
container = 'bottle' | 'cup'; 

Sau đó, thực hiện gọi lại cho nhà sản xuất beer.

- (void)parser:(PKParser *)p didMatchBeer:(PKAssembly *)a { 

    // here you could find some clever way to look up the completions for 'beer' prefix 
    // or you can hardcode the completions yourself 
    NSArray *completions = [NSArray arrayWithObjects:@"bottle", @"cup", nil]; 

    // store the completions as the current assembly's target 
    a.target = completions; 
} 

'khách hàng' của bạn hoặc 'lái xe' mã nên trông giống như:

PKParser *p = [PKParserFactory parserFromGrammar:g assembler:a]; 

PKAssembly *input = [PKAssembly assemblyWithString:@"beer"]; // get this string from the user in reality 
PKAssembly *result = [p bestMatchFor:input]; 
NSArray *completions = result.target; 

này nên cung cấp cho bạn một ý tưởng về cách những loại điều có thể được thực hiện với ParseKit. Đối với một ví dụ nhỏ như vậy giải pháp này có thể trông giống như overkill (và nó có thể là). Nhưng đối với một ví dụ thực tế lớn, đây sẽ là một giải pháp rất mạnh mẽ và thanh lịch để tự động hoàn thành.

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