Haskell 含阿托帕塞克的切片
我在看来自ATOPASEC文档的:Haskell 含阿托帕塞克的切片,haskell,attoparsec,Haskell,Attoparsec,我在看来自ATOPASEC文档的: simpleComment = string "<!--" *> manyTill anyChar (string "-->") 无法接受解析器(即无法通过testring匹配,仅匹配Word8) 有没有一种方法可以通过测试环解析的块,而不需要在过程中构建[Char] 有状态的扫描器。谓词使用并转换一个状态参数,每个转换后的状态都被传递给对输入的每个字节的谓词的连续调用,直到一个谓词不返回任何内容
simpleComment = string "<!--" *> manyTill anyChar (string "-->")
无法接受解析器(即无法通过testring匹配,仅匹配Word8
)
有没有一种方法可以通过测试环解析的块,而不需要在过程中构建[Char]
有状态的扫描器。谓词使用并转换一个状态参数,每个转换后的状态都被传递给对输入的每个字节的谓词的连续调用,直到一个谓词不返回任何内容或输入结束
它看起来像这样:
transitions :: [((Int, Char), Int)]
transitions = [((0, '-'), 1), ((1, '-'), 2), ((2, '-'), 2), ((2, '>'), 3)]
dfa :: Int -> Word8 -> Maybe Int
dfa 3 w = Nothing
dfa s w = lookup (s, toEnum (fromEnum w)) transitions <|> Just 0
转换::[(Int,Char,Int)]
跃迁=[(0,'-',1),(1,'-',2),((2,'-',2),((2,'>'),3)]
dfa::Int->Word8->Maybe Int
dfa 3 w=无
dfa s w=查找(s,toEnum(fromEnum w))仅0
然后使用scan 0 dfa
获取字节,包括最后的“-->”
。我在这里使用的状态告诉我们到目前为止看到了多少个字符。一旦我们看到它们,我们会通知scan
该停止了。这只是为了说明这个想法;为了效率,您可能希望使用比关联列表更有效的数据结构,将<代码> *EnUM>代码>调用到查找表中,甚至考虑直接编写函数。 < p>可以使用<代码>扫描< /> >:
有状态的扫描器。谓词使用并转换一个状态参数,每个转换后的状态都被传递给对输入的每个字节的谓词的连续调用,直到一个谓词不返回任何内容或输入结束
它看起来像这样:
transitions :: [((Int, Char), Int)]
transitions = [((0, '-'), 1), ((1, '-'), 2), ((2, '-'), 2), ((2, '>'), 3)]
dfa :: Int -> Word8 -> Maybe Int
dfa 3 w = Nothing
dfa s w = lookup (s, toEnum (fromEnum w)) transitions <|> Just 0
转换::[(Int,Char,Int)]
跃迁=[(0,'-',1),(1,'-',2),((2,'-',2),((2,'>'),3)]
dfa::Int->Word8->Maybe Int
dfa 3 w=无
dfa s w=查找(s,toEnum(fromEnum w))仅0
然后使用scan 0 dfa
获取字节,包括最后的“-->”
。我在这里使用的状态告诉我们到目前为止看到了多少个字符。一旦我们看到它们,我们会通知scan
该停止了。这只是为了说明这个想法;为了效率,您可能希望使用比关联列表更有效的数据结构,将*EnUM//Case>调用到查找表中,甚至考虑直接编写函数。举个例子,假设结束HTML注释也可以有数字点缀,而不是-->
,-1-9>
,-55->
和-37>
都是有效的结尾。当然你可以用scan
手动编写,但这有点违背了解析器的目的,对吧?@levantpied我相信API目前还不能方便地从attoparsec公开。将其添加到API的补丁几乎肯定会被接受,我相信没有技术原因不能创建它。同时,解析器
类型的足够多的内部结构看起来像是公开的,可以说,它们是供您在售后市场上使用的,并且只有在您有工作时才提出一个补丁。好的,在这种情况下可以工作,但是没有办法像manyTill
那样推广到自定义解析器?举个例子,假设结束HTML注释也可以有数字点缀,而不是-->
,-1-9>
,-55->
和-37>
都是有效的结尾。当然你可以用scan
手动编写,但这有点违背了解析器的目的,对吧?@levantpied我相信API目前还不能方便地从attoparsec公开。将其添加到API的补丁几乎肯定会被接受,我相信没有技术原因不能创建它。同时,解析器
类型的足够多的内部结构看起来像是公开的,可以说,它们可以让您在售后市场上使用,并且只有在您有工作时才提出一个补丁。
transitions :: [((Int, Char), Int)]
transitions = [((0, '-'), 1), ((1, '-'), 2), ((2, '-'), 2), ((2, '>'), 3)]
dfa :: Int -> Word8 -> Maybe Int
dfa 3 w = Nothing
dfa s w = lookup (s, toEnum (fromEnum w)) transitions <|> Just 0