预期的语言如下:
<hat>Nike</hat><car>Toyota</car>...
我遇到的困难是如何指定确保在一对标签中,开始标签和结束标签都具有相同的名称。
tag
是[a-zA-Z]的组合,长度小于10.
<tag>data</tag>
答案 0 :(得分:1)
tldr; BNF和EBNF都不能以合理的方式表达此CFG。
考虑明确使用EBNF 和 - 通过EBNF评论或外部语境 - 或者:
根据使用情况,可能需要这些更改/限制仍然产生CFG的功能。
(这个旧的前奏与非CFG有关,因为问题是第一次写的。)
据我所知,{{1>} 任意且未知的 <x>..</x>
不是CFL,因为Context Free Grammar仅限于终端和非终端的有限集。然而,根据上面的定义,x
无法保证在该集合中。
但是,如果给出小余地,可以为EBNF符号添加非正式限制。当然,这些是EBNF语法本身的外部。
x
ECMAScript之类的规范包含一些可能位于CFG之外且因此不在EBNF之外的限制。
但是,如果此语言 是CFL,那么它可以由CFG表示,例如:
Pair = "<" Tag^1 ">" Content "</" Tag^2 ">" (* Where Tag^1 equals Tag^2 *)
Tag = .. (* If a finite set, this could still be converted to
formal EBNF by rewriting the above Pair as all possible alterations
as shown in the next section.
Only small values of "finite" are reasonable to express. *)
Content = ..
BNF和EBNF都没有“速记”方式正式表示这种重复,我认为“标签是[a-zA-Z]与长度小于10”的组合不是合理有限的终端集,虽然它是有限的,因此属于CFG领域。
可能有其他 CFG metasyntax forms可用于正式描述此类语言,但不能用于普通的BNF / EBNF。
答案 1 :(得分:0)
这是用于XML的EBNF:http://www.w3.org/TR/REC-xml/#sec-starttags,它将元素定义为以STags开头,并以足够的ETAG结束:
element ::= EmptyElemTag | STag content ETag
但至于保持它们一样,我认为你需要在lexing策略中定义相当远的思维前瞻。一篇相关的SO帖子bnf/ebnf for xml schema表明,放弃CFG的目标并在代码中采用更基本的方法可能会更好。总而言之,我不知道那里的许多XML解析器是如何实现的。