Parsing Smalltalk解析器

Parsing Smalltalk解析器,parsing,smalltalk,Parsing,Smalltalk,我不熟悉SmallTalk,我正在使用VisualWorks。我需要解析一个字符串,并将每个字符插入一个数组中,不包括空格和所有标点符号。这不是一个家庭作业,而是一个大项目的一部分,我似乎无法理解。 请帮忙 可以这么简单(我用的是VSE,但大众应该没什么不同): 编辑(在您的评论之后): 正如我所写的,我没有使用Visual Works,也许它只是asString的一个不同实现。这是您在检查生成的数组或在工作区中显示它时看到的结果吗?结果数组的大小是多少?无论如何,您可以以更明确的方式尝试: t

我不熟悉SmallTalk,我正在使用VisualWorks。我需要解析一个字符串,并将每个字符插入一个数组中,不包括空格和所有标点符号。这不是一个家庭作业,而是一个大项目的一部分,我似乎无法理解。
请帮忙

可以这么简单(我用的是VSE,但大众应该没什么不同):

编辑(在您的评论之后):

正如我所写的,我没有使用Visual Works,也许它只是asString的一个不同实现。这是您在检查生成的数组或在工作区中显示它时看到的结果吗?结果数组的大小是多少?无论如何,您可以以更明确的方式尝试:

toThrowAway := #($  $. $, $: $; $! $?). "this contains all the characters that you want to throw away. Simply add anything else you don't want in the result"
parsedString := unparsed reject:[:c| toThrowAway includes: c]).
anArray := Array new: parsedString size.
1 to: parsedString size do: [:i| anArray at: i put: (parsedString at:i)].

可以这么简单(我用的是VSE,但大众应该没什么不同):

编辑(在您的评论之后):

正如我所写的,我没有使用Visual Works,也许它只是asString的一个不同实现。这是您在检查生成的数组或在工作区中显示它时看到的结果吗?结果数组的大小是多少?无论如何,您可以以更明确的方式尝试:

toThrowAway := #($  $. $, $: $; $! $?). "this contains all the characters that you want to throw away. Simply add anything else you don't want in the result"
parsedString := unparsed reject:[:c| toThrowAway includes: c]).
anArray := Array new: parsedString size.
1 to: parsedString size do: [:i| anArray at: i put: (parsedString at:i)].

对于更大的任务/更复杂的问题,请查看PetitPasser和/或SmaCC(都在公共商店中)。PetitParser文档位于Lukas Renggli的网站上

您可能会遇到一些问题:

  • 是否确实需要数组而不是字符串作为结果
  • 您有并需要什么编码:8位字符(哪个代码页)/UTF-8/UTF-16
  • 如果您需要经常这样做,有更好的算法,例如使用表查找。随着被拒绝字符数的增加,被接受的答案会变慢

对于更大的任务/更复杂的问题,请查看PetitPasser和/或SmaCC(都在公共商店中)。PetitParser文档位于Lukas Renggli的网站上

您可能会遇到一些问题:

  • 是否确实需要数组而不是字符串作为结果
  • 您有并需要什么编码:8位字符(哪个代码页)/UTF-8/UTF-16
  • 如果您需要经常这样做,有更好的算法,例如使用表查找。随着被拒绝字符数的增加,被接受的答案会变慢

    • 不考虑编码的因素,这里是一个简单的代码段。关键是使用OrderedCollection收集所有字母字符,然后将其转换为数组(或需要的其他集合)


      不考虑编码的因素,这里是一个简单的代码段。关键是使用OrderedCollection收集所有字母字符,然后将其转换为数组(或需要的其他集合)


      解析通常使用流来从中获取输入。从字符串中创建一个流,并使用

      [stream atEnd] whileFalse: [
         char := stream next.
         ...
      ].
      

      通过这种方式,您可以对大型输入集进行操作,例如从文件或套接字进行操作,并保持内存消耗固定。

      解析通常使用流来从中获取输入。从字符串中创建一个流,并使用

      [stream atEnd] whileFalse: [
         char := stream next.
         ...
      ].
      

      通过这种方式,您可以对大型输入集进行操作,例如从文件或套接字操作,并保持内存消耗固定。

      您可以发布您已经尝试过的内容吗?你能发布更多关于你到底需要做什么的细节吗?现在,你的问题相当模糊;很难说清楚你需要做什么,或者你被困在哪里。unparsed^ unparsed isNil ifTrue:[unparsed:=String new asValue]如果我只有这些,我需要将所有字符存储在一个数组中。@AndriyLysak请查看你的评论。这不是一个张贴代码的地方。请把它放在你的问题中,并对它的问题进行完整的解释。你能发布你已经尝试过的吗?你能发布更多关于你到底需要做什么的细节吗?现在,你的问题相当模糊;很难说清楚你需要做什么,或者你被困在哪里。unparsed^ unparsed isNil ifTrue:[unparsed:=String new asValue]如果我只有这些,我需要将所有字符存储在一个数组中。@AndriyLysak请查看你的评论。这不是一个张贴代码的地方。请把它放在你的问题中,并对它的错误进行完整的解释。这似乎是可行的,但我得到的结果是:#($t“16r0074”$h“16r0068”$i“16r0069”$s“16r0073”$i“16r0069”$s“16r0073”$a“16r0061”$s“16r0073”$t“16r0074”$r“16r0072”$i“16r0069”$n”16r006E“$g“16r0067”)如何删除“16rXXXX”从阵列中?大小是13我猜出来了,谢谢你的帮助!这似乎是可行的,但我得到的结果是:#($t“16r0074”$h“16r0068”$i“16r0069”$s“16r0073”$i“16r0069”$s“16r0073”$a“16r0061”$s“16r0073”$t“16r0074”$r“16r0072”$i“16r0069”$n“16r006E”$g“16r0067”)如何从数组中删除“16rXXXX”?大小是13,谢谢帮助!