BNF接受一个列表(无限量的变量)并附加(无限量的列表)但不附加(符号)?

时间:2018-04-21 21:26:04

标签: bnf

我正在尝试编写一个包含List的BNF并追加func':

该列表应该可以获得所需的符号,列表或数字: 因此我写了这样的话:

<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还告诉我,我需要接受一个例子:(列表1 33`g)。

如何创建一个既有限制又有限制的BNF?修复背后的想法是什么?

1 个答案:

答案 0 :(得分:0)

我添加了一个辅助表达式,它基本上是一个(符号数字或空)的流程。

而不是像我所做的那样使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>