我尝试定义一个可用于描述以下类型表的语法:
** CO1 ....... ** COL2 ..... ** COL3 ......
值.......值.......值
值.......值.......值
值.......值.......值
值.......值.......值
.....
** col1和** col2是列名。该格式可以选择性地具有附加的预定义列(例如,假设** col4和** col5也可以包括在内)。我想写一个输出这种格式的解析器。可以使用BNF或EBNF来描述这种类型的表吗?
从我到目前为止所读到的,这是一个上下文敏感的语法,因此不能用BNF或EBNF描述(我假设这是因为如果x-1也这样做,行x将只包括** col4) 。它是否正确?有没有其他方法来描述上面的表格格式?
答案 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
的规则生成所有值。如果要添加多个类型并与所涉及的列协调,语法会变得更复杂(您需要E
,E'
,E''
等,每个值类型一个,并且相应的G
,G'
,G''
等以及C
,C'
,C''
等,以及重复的制作来处理移动{ {1}}围绕每一个,但其他过程保持相似;然后你的语法只生成具有正确类型匹配的表。)