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
Parsing 解析器何时追加其输入字符串?_Parsing_Haskell_Grammar - Fatal编程技术网

Parsing 解析器何时追加其输入字符串?

Parsing 解析器何时追加其输入字符串?,parsing,haskell,grammar,Parsing,Haskell,Grammar,给定一个解析器 newtype Parser a = Parser { parse :: String -> [(a,String)] } (>>=) :: Parser a -> (a -> Parser b) -> Parser b p >>= f = Parser $ \s -> concat [ parse (f a) s' | (a, s') <- parse p s ] return :: a -> Parser

给定一个解析器

newtype Parser a = Parser { parse :: String -> [(a,String)] }

(>>=) :: Parser a -> (a -> Parser b) -> Parser b
p >>= f = Parser $ \s -> concat [ parse (f a) s' | (a, s') <- parse p s ]

return :: a -> Parser a
return a = Parser (\s -> [(a,s)])

item :: Parser Char
item = Parser $ \s -> case cs of
                         ""     -> []
                         (c:cs) -> [(c,cs)]
newtype解析器a=解析器{parse::String->[(a,String)]}
(>>=)::解析器a->(a->解析器b)->解析器b
p>>=f=Parser$\s->concat[parse(fa)s'|(a,s')Parser a
返回a=Parser(\s->[(a,s)])
项::解析器字符
item=Parser$\s->case of cs
""     -> []
(c:cs)->[(c,cs)]
我们可以看到,
消耗了给定给它的部分输入字符串(
“abc”->[('a',“bc”)]
)。是否有解析器生成额外字符串输出或替换/修改它的情况(例如,
解析器$\s->[((),'a':s)]
)?我怀疑上下文敏感语法可能就是这种情况,但很难想出一个合理的例子

对于现实世界中的问题,这样做有意义吗

工具书类

这里有几个例子,可以方便地将令牌注入到输入流中。(这实际上是如何集成到解析管道中的另一个问题。)

<> L>>P>宏扩展,在C/C++预处理阶段的风格中,这不是最好的宏扩展模型;使用C++模式解决方案,更容易使用树变换来扩展卫生宏。但是面向令牌的预处理器不会很快消失。因为它与语言SYN没有紧密耦合。在tax中,最简单的实现是用扩展中的标记替换宏(和参数,如果适用)

  • Ecmascript样式的自动分号插入(ASI)。语言语法要求在某些精确定义的情况下将分号插入到令牌流中,这很难(至少)合并到CFG中。因为ASI只有在输入流中的下一个令牌无法移动时才可能(以及其他条件),它当然可以集成到解析器循环中

  • 类似地,缩进感知块语法(例如在Haskell和Python中)当然可以通过使用注入的缩进标记或一些注入的dedent替换前导空格来实现,在解析器内部进行注入可能是一种合理的方法

  • 这并不是一个详尽的列表,但它可能至少是指示性的。并非所有这些情况都必然涉及上下文敏感性(我相信ASI在理论上可以用上下文无关语法处理,尽管我无意尝试),并且并非所有上下文敏感性的实例都必然需要标记注入(C中类型名和变量名之间的歧义只需要选择正确的标记)