标签: instaparse

我们如何使用instaparse为clojure代码定义语法?

我是解析的新手,希望分析一些clojure代码.我希望有人可以提供一个如何使用instaparse解析clojure代码的示例.我只需要做数字,符号,关键字,性别,向量和空格.

我要解析的一些例子:

(+ 1 2 
   (+ 3 4))

{:hello "there"
 :look '(i am 
           indented)}
Run Code Online (Sandbox Code Playgroud)

clojure instaparse

9
推荐指数
1
解决办法
2050
查看次数

如何测试不适合Instaparse-grammar(Clojure)的文本?

我在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)

parsing exception clojure context-free-grammar instaparse

6
推荐指数
1
解决办法
510
查看次数

有什么方法可以加速instaparse?

我正在尝试在小于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)

这需要大约一百秒.这比我希望的慢三个数量级.有没有办法加快速度,某种方式来调整语法或某些我缺少的选项?

clojure instaparse

5
推荐指数
1
解决办法
261
查看次数

你怎么得到instaparse跳过空格?

你怎么得到instaparse跳过令牌之间的空格?

(我当然可以将空格本身定义为一个标记,并将其插入每个规则右侧的所有元素之间,但我正在处理一个有三百多条规则的语法,并希望有一种方法说一次而不是三百次.)

clojure instaparse

4
推荐指数
1
解决办法
151
查看次数

如何在Clojure Instaparse中解析>字符?

我试图解析>Clojure Instaparse中的角色.我试过了|>,|\>但解析器似乎没有认识到这些.有谁知道正确的语法?

clojure instaparse

1
推荐指数
1
解决办法
119
查看次数