1

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

**co1.......**col2......**col3......

价值.......价值.......价值

价值.......价值.......价值

价值.......价值.......价值

价值.......价值.......价值

......

桌子的图片

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

从我目前所读的内容来看,这是一个上下文相关的语法,因此不能用 BNF 或 EBNF 来描述(我认为这是因为如果 x-1 也这样做,行 x 将只包含 **col4)。这个对吗?是否有任何替代方法来描述上面的表格格式?

4

1 回答 1

1

如果变量数大于必须具有相同条目数的两列,或变量数大于必须具有相同条目数的两行,则该语言不能是上下文无关的,原因相同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。如果要添加多个类型并与所涉及的列协调,则语法变得更加复杂(您需要E, E',E''等,每个值类型一个,以及对应G的 , G',G''等和C, C',C''等,并重复处理B每一个移动的产生式,但除此之外过程保持相似;然后你的语法将只产生具有正确类型匹配的表)。

于 2017-07-19T13:41:08.097 回答