解析可以包含ANTLR4括号的列表

时间:2017-07-11 01:33:16

标签: parsing antlr4 lexer parentheses s-expression

假设我想创建一个类似于Lisp的语法,其中所有表达式都在开括号和近括号之间。

例如:

(+ 1 2)

我还希望语法能够将字符串('(def foo))解析为类似于(expression ( literal '(def foo) ))的解析树。 这意味着它应该成功地将文字表达式中的括号与文字相关联。

1 个答案:

答案 0 :(得分:1)

嗯,LISP一般在语法方面是非常用户可扩展的,所以我不知道如何获得它的任何BNF(+)形式。 Here是对它的讨论;如果你搜索它,我相信还有更多。

但是对于玩具示例,这可能会很好:

<s_expression>  ::= <atomic_symbol>
              | "(" <s_expression> "." <s_expression> ")"
              | <list> .

<_list>         ::= <s_expression> <_list>
              | <s_expression> .

<list>          ::= "(" <s_expression> <_list> ")" .

<atomic_symbol> ::= <letter> <atom_part> | "'"  <s_expression> .

<atom_part>     ::= <empty> | <letter> <atom_part> | <number> <atom_part> .

<letter>        ::= "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j"
              | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t"
              | "u" | "v" | "w" | "x" | "y" | "z" .

<number>        ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "0" .

<empty>         ::= " ".

modified from here

我匆忙修改了语法,所以如果你发现任何问题,请告诉我。

另外,我很久没有使用过ANTLR了,所以我不知道它是否完全符合它的格式。但是,将它格式化应该是微不足道的。