Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 含阿托帕塞克的切片_Haskell_Attoparsec - Fatal编程技术网

Haskell 含阿托帕塞克的切片

Haskell 含阿托帕塞克的切片,haskell,attoparsec,Haskell,Attoparsec,我在看来自ATOPASEC文档的: simpleComment = string "<!--" *> manyTill anyChar (string "-->") 无法接受解析器(即无法通过testring匹配,仅匹配Word8) 有没有一种方法可以通过测试环解析的块,而不需要在过程中构建[Char] 有状态的扫描器。谓词使用并转换一个状态参数,每个转换后的状态都被传递给对输入的每个字节的谓词的连续调用,直到一个谓词不返回任何内容

我在看来自ATOPASEC文档的:

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