给定解析器
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)]我们可以看到,item使用给它的部分输入字符串("abc" -> [('a', "bc")])。解析器是否会产生额外的字符串输出或替换/修改它(例如Parser $ \s -> [((), 'a':s)])?我怀疑上下文敏感的语法可能就是这种情况,但想出一个合理的例子却有困难。
对于现实世界的问题,为什么这么做是有道理的呢?
参考文献
发布于 2019-04-21 16:35:12
以下是将令牌插入到输入流中很方便的几种情况。(另一个问题是如何将其实际集成到解析管道中。)
这并不是一个详尽的清单,但至少可以说明问题。并不是所有这些情况都一定涉及上下文敏感性(理论上,ASI可以使用上下文无关的语法来处理,尽管我无意尝试),并且并不是所有上下文敏感的实例都必然需要令牌注入(类型和变量名称之间的C中的歧义只需要选择正确的令牌)。
https://stackoverflow.com/questions/55771390
复制相似问题