我正在用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函数。你知道怎么做吗?
更新这里是一个规则和硬编码版本的示例:
(ROC
(fn
(cond
(> (ROC) 100) "buy"
:else
()
)
)
你有试过instapass吗?
它从上下文无关的语法器生成解析器
(ns example.core
(:require [instaparse.core :as insta])
(def as-and-bs
(insta/parser
"S = AB*
AB = A B
A = 'a'+
B = 'b'+"))
首先,我同意@Arthur的观点,即使用Instapass生成你的语法。
下一步是编写一个函数,将语法转换为表示代码的Clojure数据结构。
例如,如果语法解析为
[:S [:EXPR [:WSK "ROC"] [:OpA ">"] [:NUM "100"]] :>> [:FCT "BUY"]] ; "ROC > 100 << BUY"
生成函数就像普通的Clojure数据操作一样。获取解析器的结果,将其转换为代码。然后在宏中使用生成的代码。这里有一个简化的例子,用于处理这个例子需要处理的内容。
(defn parse-expr [expr]
(let [[_ [part1-type part1-val] [part2-type part2-val] [part3-type part3-val]] expr]
(if (and (= :WSK part1-type) (= :OpA part2-type) (= :NUM part3-type))
(let [wsk (variable part1-val)
opa (variable part2-val)
num (Integer/valueOf part3-val)]
(list opa (list wsk) num)))))
(defmacro generate-funcs [parse-tree]
(let [[_ expr _ [_ fact]] parse-tree
expr (parse-expr expr)
fact (symbol fact)]
`(fn [] (if ~expr (str ~fact) ()))))
试着跑步
(parse-expr [:EXPR [:WSK "B"] [:OpA "<"] [:NUM "1"]])
和
(macroexpand-1 '(generate-funcs [:S [:EXPR [:WSK "B"] [:OpA "<"] [:NUM "1"]] :>> [:FCT "b"]]))
为了更好地理解我所指的将数据转换为代码的内容。
问题 你想根据一组语法规则解析文本并执行命令,或者构造一个代表输入的抽象语法树。 如果语法非常简单,你可以不去使用一些框架,而是自己写这个解析器。 解决方案 在这个问题中,我们集中讨论根据特殊语法去解析文本的问题。 为了这样做,你首先要以BNF或者EBNF形式指定一个标准语法。 比如,一个简单数学表达式语法可能像下面这样: expr ::= expr + term | expr - t
问题内容: 我试图简化我的代码:我想存储键和值(所有字符串)。 我实际上是使用A 来存储它。hat方法可以是值()或新节点()。 如何简化此代码?递归函数会很好。 问题答案: 假设您的最终目标只是将JSON反序列化为,那么使用Jackson可以简单得多。使用: 您将需要错误处理等,但这是一个很好的起点。
我用一个递归函数尝试过它,它迭代语句,当语句不是文字时,它会跟随对象到达下一个节点。像这样: 但不知怎的,我用这个方法没有什么进展。非常感谢你的每一次洞察。
我试图简化我的代码:我想存储键和值(所有字符串)。 我实际上在使用
我试图在java中实现线性回归。我的假设是θ0θ1*x[i]。我试图计算θ0和θ1的值,使成本函数最小。我正在用梯度下降来找出值- 在 在收敛之前,这种重复是什么?我知道这是局部最小值,但我应该在while循环中输入的确切代码是什么? 我对机器学习非常陌生,刚开始编写基本的算法以获得更好的理解。任何帮助都将不胜感激。
本文向大家介绍js使用递归解析xml,包括了js使用递归解析xml的使用技巧和注意事项,需要的朋友参考一下 xml结构: 解析方法: 以上就是javascript使用递归解析XML的全部代码了,超级简洁,非常使用,给需要的小伙伴参考下。