假设我想创建一个类似于Lisp的语法,其中所有表达式都在左括号和右括号之间。
例如:
(+ 1 2)
我还希望语法能够将字符串解析为类似于(expression ( literal '(def foo) ))
的解析树('(def foo))
。 这意味着它应该成功地将文本表达式中的括号与文本相关联。
总的来说,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,所以我不知道它是否完全采用它所排除的格式。但是正确格式化它应该是微不足道的。