2017-07-24 13 views
5

Trong Edit distance: Ignore start/end, tôi đã cung cấp giải pháp Perl 6 cho một vấn đề phù hợp mờ mờ. Tôi đã có một ngữ pháp như thế này (mặc dù có lẽ tôi đã cải thiện nó sau 3 Chỉnh sửa #):Làm cách nào tôi có thể chuyển đối số cho ngữ pháp Perl 6?

grammar NString { 
    regex n-chars { [<.ignore>* \w]**4 } 
    regex ignore { \s } 
    } 

hiểu theo nghĩa đen 4 chính là chiều dài của chuỗi mục tiêu trong ví dụ. Nhưng vấn đề tiếp theo có thể là một số chiều dài khác. Vậy làm cách nào tôi có thể nói ngữ pháp bao lâu tôi muốn kết hợp đó?

Trả lời

4

Mặc dù tài liệu không hiển thị ví dụ hoặc sử dụng thông số $args, tôi đã tìm thấy một trong số S05-grammar/example.t in roast.

Chỉ định các đối số trong :args và cung cấp cho regex chữ ký thích hợp. Bên trong regex, truy cập các đối số trong một khối mã:

grammar NString { 
    regex n-chars ($length) { [<.ignore>* \w]**{ $length } } 
    regex ignore { \s } 
    } 

class NString::Actions { 
    method n-chars ($/) { 
     put "Found $/"; 
     } 
    } 

my $string = 'The quick, brown butterfly'; 

loop { 
    state $from = 0; 
    my $match = NString.subparse(
     $string, 
     :rule('n-chars'), 
     :actions(NString::Actions), 
     :c($from++), 
     :args(\(5)) 
     ); 

    last unless ?$match; 
    } 

Tôi vẫn không chắc chắn về các quy tắc để chuyển các đối số. Điều này không làm việc:

 :args(5) 

tôi nhận được:

Quá ít positionals thông qua; dự kiến ​​2 đối số nhưng có 1

này hoạt động:

 :args(5,) 

Nhưng đó là đủ suy nghĩ về vấn đề này cho một đêm.

+2

Nó hy vọng sẽ được thông qua một 'Capture', và nếu nó không nhận được một sau đó gọi coercer' .Capture'. Một 'List' sẽ coerce thành một' Capture' với các phần tử danh sách như là các đối số vị trí. Một 'Int' không biến thành bất kỳ thứ gì hữu ích (nó rơi trở lại' Mu.Capture', lấy các thuộc tính công khai và sử dụng các tham số đó như các tham số có tên; một 'Int' không có thuộc tính công khai). –

+0

Làm thế nào để những biến đó thành hai đối số? –

+0

tôi hy vọng rằng đề cập đến invocant, tức là "tự" đối số, như regexes trong một lớp học là phương pháp. – timotimo

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