BNF 接受列表(无限量的变量)和追加(无限量的列表)但不接受追加(符号)?
BNF accepting a list( infinite amount of vars) and append(infinite amount of lists) but not append(symbol)?
我正在尝试编写一个包含 List 并附加 func 的 BNF':
该列表应该包含所需数量的符号、列表或数字:
因此我写了这样的东西:
<LIST> ::= <SNS>
| <APPEND>
| (list <SNS>)
| (list <LIST>)
| (list <SNS> <LIST>)
追加应该得到尽可能多的列表,因此我写了类似的东西:
<APPEND>::=
<LIST>
| (append <LIST>)
| (append <LIST> <APPEND>)
该语言也接受符号数字或 null 因此我写道:
<SNS> ::= <null>
| <num>
| '<sym>
我的问题是这个 BNF 的部分请求不应该接受 (append <num>)
。
我解决这个问题的方法是:
<LIST> ::= <null> //this is a list therefore (append null) is good
| <APPEND> // also is a list
| <LIST>
| (list <SNS>)
| (list <LIST>)
| (list <SNS> <LIST>)
<APPEND>::= (append <LIST>)
| <LIST>
| (append <LIST> <APPEND>)
问题是BNF还告诉我,我需要举个例子:(list 1 33`g).
如何创建一个接受这两个限制的 BNF?修复背后的想法是什么?
好吧,我添加了一个辅助表达式,它基本上是一个(符号数字或空值)流。
我没有像我那样创建表达式的基础,而是将 func` 列表作为输入流输入。
旧表达式:
<LIST> ::= <null> //this is a list therefore (append null) is good
| <APPEND> // also is a list
| <LIST>
| (list <SNS>)
| (list <LIST>)
| (list <SNS> <LIST>)
<APPEND>::= (append <LIST>)
| <LIST>
| (append <LIST> <APPEND>)
BNF - 新表达式
<LIST> ::= <null>
| <CONS>
| <APPEND>
| (list <SNS_FLOW>) ; this is what will get (list 1 2 ...)
| (list <LIST>)
| (list <SNS_FLOW> <LIST>) ; so I can accept: (list 'a (list ...))
| (list <LIST> <SNS_FLOW>) ; so I can accept: (list (list ...) 'a)
<APPEND>::= (append <LIST>)
| <LIST>
| (append <LIST> <APPEND>)
<SNS_FLOW>::= <SNS> ; this is the new expression
| <SNS><SNS_FLOW>
我正在尝试编写一个包含 List 并附加 func 的 BNF':
该列表应该包含所需数量的符号、列表或数字: 因此我写了这样的东西:
<LIST> ::= <SNS>
| <APPEND>
| (list <SNS>)
| (list <LIST>)
| (list <SNS> <LIST>)
追加应该得到尽可能多的列表,因此我写了类似的东西:
<APPEND>::=
<LIST>
| (append <LIST>)
| (append <LIST> <APPEND>)
该语言也接受符号数字或 null 因此我写道:
<SNS> ::= <null>
| <num>
| '<sym>
我的问题是这个 BNF 的部分请求不应该接受 (append <num>)
。
我解决这个问题的方法是:
<LIST> ::= <null> //this is a list therefore (append null) is good
| <APPEND> // also is a list
| <LIST>
| (list <SNS>)
| (list <LIST>)
| (list <SNS> <LIST>)
<APPEND>::= (append <LIST>)
| <LIST>
| (append <LIST> <APPEND>)
问题是BNF还告诉我,我需要举个例子:(list 1 33`g).
如何创建一个接受这两个限制的 BNF?修复背后的想法是什么?
好吧,我添加了一个辅助表达式,它基本上是一个(符号数字或空值)流。
我没有像我那样创建表达式的基础,而是将 func` 列表作为输入流输入。
旧表达式:
<LIST> ::= <null> //this is a list therefore (append null) is good
| <APPEND> // also is a list
| <LIST>
| (list <SNS>)
| (list <LIST>)
| (list <SNS> <LIST>)
<APPEND>::= (append <LIST>)
| <LIST>
| (append <LIST> <APPEND>)
BNF - 新表达式
<LIST> ::= <null>
| <CONS>
| <APPEND>
| (list <SNS_FLOW>) ; this is what will get (list 1 2 ...)
| (list <LIST>)
| (list <SNS_FLOW> <LIST>) ; so I can accept: (list 'a (list ...))
| (list <LIST> <SNS_FLOW>) ; so I can accept: (list (list ...) 'a)
<APPEND>::= (append <LIST>)
| <LIST>
| (append <LIST> <APPEND>)
<SNS_FLOW>::= <SNS> ; this is the new expression
| <SNS><SNS_FLOW>