1

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

例如:

(+ 1 2)

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

4

1 回答 1

1

好吧,LISP 通常在语法方面是非常易于用户扩展的,所以我不知道获得任何 BNF(+) 形式的可能性有多大。是关于它的讨论;如果您搜索它,我相信还有更多。

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

<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>         ::= " ".

从这里修改

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

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

于 2017-07-11T10:21:16.947 回答