【问题标题】:Finding tokens in a Smalltalk String with PetitParser使用 PetitParser 在 Smalltalk 字符串中查找标记
【发布时间】:2011-10-18 07:15:09
【问题描述】:

我要解析

'This,is,an,example,text'

类似于 findTokens

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

但无法弄清楚如何使用 PetitParser、delimitedBy: 和 separatorBy: 并没有帮助我尝试过

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

但显然没用

【问题讨论】:

    标签: parsing smalltalk petitparser


    【解决方案1】:

    您可以将delimitedBy:withoutSeparators 结合使用:

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

    似乎是最近对 PetitParser 的改进。

    【讨论】:

      【解决方案2】:

      a #delimitedBy: b 扩展为 a , (b , a) star,因此您的解析器按原样说“给我一个用逗号分隔的字符”。

      它的可读性不是很好,但这就是你想要的:

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

      第一个子句说“解析任何不是逗号的东西”。所以给定'12,24',你会得到#('12' $, '24')

      【讨论】:

        【解决方案3】:

        当我想排除某些东西时,我一直使用 PetitParser 这个模式。只需将“我正在寻找的内容”或“我想要排除的内容”(以更容易描述的为准)定义为解析器,然后将其取反,并根据需要进行处理。

        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.
        

        【讨论】:

        • 这个copyWithout: 真的很难看......我怀疑有一种方法可以通过定义separatedBy: 的变体来避免它,它不会首先将分隔符添加到输出中......另一个解决方案可能是foldLeft:,但我认为它需要你自己的类来收集令牌。
        【解决方案4】:

        试试

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

        我希望我明白你想要什么

        【讨论】:

        • 是的,唯一的问题是,如果单词包含任何会破坏解析的非字母字符?
        • 是的,确实如此。我只是类似于你的例子。您需要指定您真正需要解析的内容。如果这就是你可能会更好地使用 $,asParser 否定 Sean 建议的一切
        猜你喜欢
        • 1970-01-01
        • 2013-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-28
        • 1970-01-01
        • 1970-01-01
        • 2020-09-21
        相关资源
        最近更新 更多