我是解析的新手,希望分析一些clojure代码.我希望有人可以提供一个如何使用instaparse解析clojure代码的示例.我只需要做数字,符号,关键字,性别,向量和空格.
我要解析的一些例子:
(+ 1 2
(+ 3 4))
{:hello "there"
:look '(i am
indented)}
Run Code Online (Sandbox Code Playgroud) 我在Instaparse(Clojure)中编写了一个使用无上下文语法解析字符串的项目.现在我想测试几个输入字符串的解析结果.某些输入字符串可能不适合语法.到目前为止,我只测试了"解析后的字符串不符合预期".但我认为使用测试异常会更准确(is (thrown? ...)).是否抛出异常?在我看来,Parse error...生成了一些输出(Containing ),但没有抛出任何异常.
我的project.clj是:
(defproject com.stackoverflow.clojure/tests "0.1.0-SNAPSHOT"
:description "Tests of Clojure test-framework."
:url "http://example.com/FIXME"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.6.0"]
[instaparse "1.3.4"]])
Run Code Online (Sandbox Code Playgroud)
我的核心资源是:
(ns com.stackoverflow.clojure.testInstaparseWrongGrammar
(:require [instaparse.core :as insta]))
(def parser (insta/parser "
<sentence> = words <DOT>
DOT = '.'
<words> = word (<SPACE> word)*
SPACE = ' '
word = #'(?U)\\w+'
"))
(defn formatter [expr]
(->> (parser expr)
(insta/transform {:word identity})
(apply str)))
Run Code Online (Sandbox Code Playgroud)
我的测试来源是:
(ns com.stackoverflow.clojure.testInstaparseWrongGrammar-test
(:require [clojure.test :refer …Run Code Online (Sandbox Code Playgroud) 我正在尝试在小于700k的dimacs文件上使用instaparse,具有以下语法
<file>=<comment*> <problem?> clause+
comment=#'c.*'
problem=#'p\s+cnf\s+\d+\s+\d+\s*'
clause=literal* <'0'>
<literal>=#'[1-9]\d*'|#'-\d+'
Run Code Online (Sandbox Code Playgroud)
像这样打电话
(def parser
(insta/parser (clojure.java.io/resource "dimacs.bnf") :auto-whitespace :standard))
...
(time (parser (slurp filename)))
Run Code Online (Sandbox Code Playgroud)
这需要大约一百秒.这比我希望的慢三个数量级.有没有办法加快速度,某种方式来调整语法或某些我缺少的选项?
你怎么得到instaparse跳过令牌之间的空格?
(我当然可以将空格本身定义为一个标记,并将其插入每个规则右侧的所有元素之间,但我正在处理一个有三百多条规则的语法,并希望有一种方法说一次而不是三百次.)
我试图解析>Clojure Instaparse中的角色.我试过了|>,|\>但解析器似乎没有认识到这些.有谁知道正确的语法?