В настоящее время я работаю над написанием двух функций, которые будут использоваться для возврата списков всех отдельных терминалов, которые появляются в данной грамматике.
Вот тип для грамматики:
data Grammar = Grammar [Prod]
deriving (Show, Eq)
Вот что у меня есть:
terminals :: Grammar -> [String]
terminals ts = nub [ x | x <-ts]
nonterms :: Grammar -> [String]
nonterms nt = nub [ x | x <- nt]
Где грамматика, которая помещается в функцию, будетбыть примерно таким (3 примера):
g4 = "P -> true ; P -> false; P -> not P ; P -> P and P"
g5 = "P -> P & N; P -> N; N -> ~ N; N -> t"
g6 = "P -> N & P; P -> N; N -> ~ N; N -> t"
Однако используемые мной функции не работают, поскольку GHCI не может сопоставить ожидаемый тип «[String]» с фактическим типом «Грамматика».
Я отказываюсь от базовых принципов контекстно-свободных грамматик (CFG), что контекстно-свободной грамматикой является
G = (T,N,P,S)
, где T - это набор терминальных символов ("токенов")."), набор N нетерминальных символов, набор P произведений и начальный символ S.
Как я могу использовать / написать две функции, которые могут возвращать списки всех различных терминалов (соответственно, нетерминалов), которыепоявляются в данной грамматике.Три примера грамматики выше.Спасибо.