2011-10-18 11 views
7

Tôi muốn phân tíchtokens Finding trong Smalltalk String với PetitParser

'This,is,an,example,text' 

như trong findTokens

'This,is,an,example,text' findTokens: $, 
an OrderedCollection('This' 'is' 'an' 'example' 'text') 

nhưng không thể tìm ra cách để làm điều đó với PetitParser, delimitedBy: và separatedBy: didn' t đã giúp tôi Tôi đã thử

(#any asParser delimitedBy: $, asParser) plus flatten parse: 'This,is,an,example,text' 

nhưng rõ ràng là không hoạt động

Trả lời

1

tôi sử dụng mô hình này tất cả các thời gian với PetitParser khi tôi muốn loại bỏ một cái gì đó. Chỉ cần xác định hoặc "những gì tôi đang tìm kiếm" hoặc "những gì tôi muốn loại trừ" (tùy theo cách nào dễ dàng hơn để mô tả) như một trình phân tích cú pháp, và sau đó phủ nhận nó và xử lý khi cần thiết.

s := 'This,is,an,example,text'. 
separator := $, asParser ==> [ :n | nil ]. 
token := separator negate plus flatten. 
p := (token separatedBy: separator) ==> [ :nodes | 
    nodes copyWithout: nil ]. 
p parse: s. 
+1

Điều này 'copyWithout:' thực sự cảm thấy xấu xí ... Tôi nghi ngờ có một cách để tránh nó bằng cách xác định một biến thể của 'separatedBy:' mà sẽ không thêm các dấu phân cách vào đầu ra ở vị trí đầu tiên… Một giải pháp khác có thể là với 'foldLeft:' nhưng như tôi thấy nó yêu cầu lớp của riêng bạn cho việc thu thập các thẻ. –

2

a #delimitedBy: b mở rộng thành a , (b , a) star, vì vậy trình phân tích cú pháp của bạn đang được nói "cung cấp cho tôi một ký tự được phân tách bằng dấu phẩy".

Đó là không phải là rất có thể đọc được, nhưng điều này làm những gì bạn muốn:

((($, asParser not , #any asParser) ==> [:nodes | nodes second]) 
    plus flatten delimitedBy: $, asParser 

Mệnh đề đầu tiên nói "phân tích bất cứ điều gì đó không phải là một dấu phẩy". Vì vậy, hãy cho '12,24' bạn nhận được #('12' $, '24').

1

Hãy thử

(#word asParser plus flatten separatedBy: $, asParser) 
    ==> [:nodes| nodes copyWithout: $, ] 

Tôi hy vọng tôi hiểu những gì bạn muốn

+0

Có, vấn đề duy nhất với câu hỏi đó là nếu từ đó chứa bất kỳ ký tự không phải chữ cái nào sẽ phá vỡ phân tích cú pháp không? – user1000565

+1

Vâng, đúng vậy. Tôi giống như ví dụ của bạn. Bạn cần xác định những gì bạn thực sự cần phân tích cú pháp. Nếu nó là tất cả mọi thứ bạn có thể tốt hơn off với $, asParser phủ nhận rằng Sean đề nghị –

3

Bạn có thể sử dụng delimitedBy: kết hợp với withoutSeparators:

|text parser| 

text := 'This,is,an,example,text'. 
parser := (#word asParser plus flatten delimitedBy: ($, asParser)) withoutSeparators. 

parser parse: text 

Có vẻ là một cải tiến gần đây để PetitParser.