BNF(EBNF)用可选列描述表格式

时间:2017-07-17 21:33:22

标签: context-free-grammar bnf ebnf context-sensitive-grammar

我尝试定义一个可用于描述以下类型表的语法:

** CO1 ....... ** COL2 ..... ** COL3 ......

值.......值.......值

值.......值.......值

值.......值.......值

值.......值.......值

.....

picture of table

** col1和** col2是列名。该格式可以选择性地具有附加的预定义列(例如,假设** col4和** col5也可以包括在内)。我想写一个输出这种格式的解析器。可以使用BNF或EBNF来描述这种类型的表吗?

从我到目前为止所读到的,这是一个上下文敏感的语法,因此不能用BNF或EBNF描述(我假设这是因为如果x-1也这样做,行x将只包括** col4) 。它是否正确?有没有其他方法来描述上面的表格格式?

1 个答案:

答案 0 :(得分:0)

如果您的变量数大于两列且必须具有相同数量的条目,或者变量数大于两行且必须具有相同数量的条目,则该语言不能无上下文同样的原因a^n b^n c^n不具备上下文。

如果你想要一个不受限制的表语法,这样的东西就可以了:

// begin with A^n B
  S := AS | AB

// produce C^n D^n B
  A := CD               
 DC := CD

// produce C^n . E^n B
 DB := BE
CBE := C.EB
 BE := EB

// produce C^n . E^n G^n B
  E := EG
 GE := EG

// produce C^n (. E^n)+ B
 GB := BE
EBE := E.EB
 BE := EB

// produce C^n (. E^n)+
  B := (empty)

// lead column headings and values to terminal symbols
  C := (rules for headers)
  E := (rules for values)

为简单起见,上面假设所有值都属于一种类型;也就是说,可以使用E的规则生成所有值。如果要添加多个类型并与所涉及的列协调,语法会变得更复杂(您需要EE'E''等,每个值类型一个,并且相应的GG'G''等以及CC'C''等,以及重复的制作来处理移动{ {1}}围绕每一个,但其他过程保持相似;然后你的语法只生成具有正确类型匹配的表。)