Я создаю некоторую экспертную систему с Clojure, и мне нужно разработать парсер для рекурсивного спуска для чтения правил из текстового файла и создания из него функций clojure. Я написал функцию, которая проверяет, поддерживает ли текстовый файл мою грамматику, и дает мне список строк с такими элементами, как имена функций, числа, имена фактов для моей системы, арифметические и логические операторы. Вот как моя грамматика выглядит следующим образом:Анализатор рекурсивного спуска в Clojure
RULE := EXPR >> FACT
EXPR := (WSK OpA NUM) || (FACT) || (EXPR OpL EXPR) || (WSK OpA WSK)
OpL := AND || OR
OpA := > || < || ==
WSK := [A-Z]+
FACT := [a-z]+
NUM := [0-9]+\.?[0-9]*
И это моя функция для проверки грамматики:
(defn wyr
"new expression"
[przetworzone doPrzetworzenia]
(cond
(empty? doPrzetworzenia) przetworzone
(empty? przetworzone) (if (empty? (acceptLP (first doPrzetworzenia)))
"error-poczatek";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptLP (first przetworzone)))) (if (empty? (acceptFACT (first doPrzetworzenia)))
(if (empty? (acceptWSK (first doPrzetworzenia)))
(if (empty? (acceptLP (first doPrzetworzenia)))
"error-LP";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptFACT (first przetworzone)))) (if (empty? (acceptPP (first doPrzetworzenia)))
"error-FACT";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptWSK (first przetworzone)))) (if (empty? (acceptOpA (first doPrzetworzenia)))
(if (empty? (acceptPP (first doPrzetworzenia)))
"error-WSK";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptOpA (first przetworzone)))) (if (empty? (acceptNUM (first doPrzetworzenia)))
(if (empty? (acceptWSK (first doPrzetworzenia)))
"error-OpA";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptPP (first przetworzone)))) (if (empty? (acceptOpL (first doPrzetworzenia)))
(if (empty? (acceptImplication (first doPrzetworzenia)))
"error-PP";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptOpL (first przetworzone)))) (if (empty? (acceptLP (first doPrzetworzenia)))
"error-OpL";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptImplication (first przetworzone)))) (if (empty? (acceptFACT (first doPrzetworzenia)))
"error-Implication";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
(not (empty? (acceptNUM (first przetworzone)))) (if (empty? (acceptPP (first doPrzetworzenia)))
"error-NUM";todo - error
(wyr (cons (first doPrzetworzenia) przetworzone) (rest doPrzetworzenia)))
:else
"error")
)
Теперь я хотел бы создать функцию Clojure из моего списка строки, которая выше функции дает мне , У вас есть идеи, как это сделать?
UPDATE Вот пример правила и жестко ее вариант:
(ROC> 100) >> купить
(fn
(cond
(> (ROC) 100) "buy"
:else
()
)
)
Вы могли бы включить немного больше контекста (каламбур);) где приняты acceptFACT acceptLP и т. Д. –
Откуда появляется ROC в вашем примере (существующая функция, аргумент, что-то еще)? Это похоже на функцию, учитывая, что вы ее вызываете. Кроме того, имеет ли внешняя функция какие-либо аргументы? На данный момент я предполагаю функцию и никаких аргументов. – deterb
Правильно ли ваша грамматика?Он не поддерживает наличие более одного символа для WSK и FACT, а FACT - только в нижнем регистре, в то время как в примере, который вы указали, используется верхний регистр. Тот же вопрос касается BUY - я не знаю, откуда он. Поскольку вы не вызываете его, я собираюсь принять переменную, хотя она также выглядит как строка. – deterb