clojure - 为 ANTLR 语法编写解释器

标签 clojure interpreter antlr4

我为 APL 子集制作了一个语法。

grammar APL;

program: (statement NEWLINE)*;

statement: thing;

assignment: variable LARR thing;

thing: simpleThing
     | complexThing;

escapedThing: simpleThing
            | '(' complexThing ')';

simpleThing: variable    # ThingVariable
           | number      # ThingNumber
           ;

complexThing: unary      # ThingUOp
            | binary     # ThingBOp
            | assignment # ThingAssignment
            ;

variable: CAPITAL;

number: DIGITS;

unary: iota   # UOpIota
     | negate # UOpNegate
     ;
  iota: SMALL_IOTA number;
  negate: TILDA thing;

binary: drop         # BOpDrop
      | select       # BOpSelect
      | outerProduct # BOpOuterProduct
      | setInclusion # BOpSetInclusion
      ;
  drop: left=number SPIKE right=thing;
  select: left=escapedThing SLASH right=thing;
  outerProduct: left=escapedThing OUTER_PRODUCT_OP right=thing;
  setInclusion: left=escapedThing '∊' right=thing;

NEWLINE: [\r\n]+;

CAPITAL: [A-Z];
CAPITALS: (CAPITAL)+;

DIGITS: [0-9]+;

TILDA: '~';
SLASH: '/';

// greek
SMALL_IOTA: 'ι' | '@i';

// arrows
LARR: '←' | '@<-';
SPIKE: '↓' | '@Iv';

OUTER_PRODUCT_OP: '∘.×' | '@o.@x';

现在我想为它创建一个解释器。我正在尝试使用 clj-antlr与 Clojure。我怎么做?

最佳答案

正如 Jared314 所指出的,看看 instaparse :

这是您创建语法的方式:

(def as-and-bs
(insta/parser
 "S = AB*
  AB = A B
  A = 'a'+
  B = 'b'+"))

你是这样称呼它的:
(as-and-bs "aaaaabbbaaaabb")

这是默认格式的结果:
[:S
  [:AB [:A "a" "a" "a" "a" "a"] [:B "b" "b" "b"]]
  [:AB [:A "a" "a" "a" "a"] [:B "b" "b"]]]

虽然 ANTLR 确实做得很好,但在 Clojure 世界中,您可以使用 instaparse 去除所有周围的胶水。

关于clojure - 为 ANTLR 语法编写解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19503908/

相关文章:

clojure - Hiccup:如何在试剂中显示引号?

Clojure 无法在 clojars 依赖项中找到 __init.class

c++ - 与编译器相比,为什么调试器在发生错误时更加具体?

java - 为简单的 Java/Groovy DSL 构建运行器/执行器/解释器

clojure - 使用 LWJGL 设置 La Clojure

javascript - 函数测试值范围内的值并返回值

c - 有没有办法在 C switch 语句中使用指针?

java - 在ANTLR4中处理自定义异常

pretty-print - 如何使用 ANTLR4 漂亮地打印作品和行号?

antlr4 - 处理 Antlr 中的关键字冲突