Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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 haskell解析上下文无关语法以与字符串进行比较_Parsing_Haskell_Context Free Grammar - Fatal编程技术网

Parsing haskell解析上下文无关语法以与字符串进行比较

Parsing haskell解析上下文无关语法以与字符串进行比较,parsing,haskell,context-free-grammar,Parsing,Haskell,Context Free Grammar,我试图表示一个上下文无关语法,我想解析它,以便将字符串与Prod“a”[NT“B”,NT“C”]的进行比较,但我不知道如何进行,有人能帮我吗 data Symbol a b = T a | NT b deriving (Eq,Show) data Produktion a b = Prod b [Symbol a b] deriving (Eq,Show) type Produktionen a b = [Produktion a b] liste11 = [Prod "A" [N

我试图表示一个上下文无关语法,我想解析它,以便将字符串与
Prod“a”[NT“B”,NT“C”]
进行比较,但我不知道如何进行,有人能帮我吗

data Symbol a b = T a | NT b 
deriving (Eq,Show)

data Produktion a b = Prod b [Symbol a b]
deriving (Eq,Show)

type Produktionen a b = [Produktion a b]   

liste11 = [Prod "A" [NT "B", NT "C"]
      ,Prod "B" [NT "D", NT "E"]
      ,Prod "D" [T "d"]
      ] --

有更简单的方法,但可以使用原始方法

fromNT :: (Symbol a b) -> b
fromNT (NT b) = b
fromNT (T a) = undefined

extractNT :: (Eq b) => b -> [Produktion a b] -> [[b]]   
extractNT _ [] = [[]]
extractNT b (p:ps)  | is p = (map fromNT (symbol p)) : extractNT b ps
                    | otherwise = []          
                    where is (Prod x xs) = x==b
                          symbol (Prod _ xs) = xs
现在你可以写作了

> extractNT "A" liste11                         
[["B","C"]]
更新

我认为它不适用于泛型类型,但适用于字符串

value :: (Symbol String String) -> String
value (T a) = a
value (NT b) = b
其他访问器仍然可以是泛型的

symbol :: (Produktion a b) -> [Symbol a b]
symbol (Prod _ ss) = ss

tag :: (Produktion a b) -> b
tag (Prod b _) = b
你现在可以说

> map (map value) $ map symbol $ filter (\p -> tag p=="D") liste11
[["d"]]

> map (map value) $ map symbol $ filter (\p -> tag p=="A") liste11
[["B","C"]]

我不知道。你在比较什么?您是在将产品与每个Othert进行比较,还是只是按产品名称查找产品,如“a”?非常感谢,但我也需要提取终端,我已经尝试过,但无法解决…请更新您要提取的内容的问题。您提供的示例正是这种情况。我编辑了产品列表,编辑:我还想提取产品“D”,因此它将返回右侧的“D”。结果可能不均匀,当您混合使用T和NT CON时会发生什么?您可以获得
a
b
类型的列表。语法应为乔姆斯基范式,即仅表示NT到NT或NT到T