BNF Variant是什么?

时间:2014-11-16 16:24:18

标签: bison bnf

我正在研究使用我在Github上找到的一些BNF文件制作一个基于Bison的解析器。然而,我的问题是我似乎无法确定文件使用的BNF的变体。

Here is a link到包含BNF变种样本的文件夹。

bnf.rkt中,作者引用BNF Wikipedia page,但他的文件看起来不像它:

## The following comes from: http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form
<syntax> : <rule> | <rule> <syntax>
<rule> : <opt-whitespace> "<" <RULE-NAME> ">" <opt-whitespace> "::="
<opt-whitespace> <expression> <line-end>
<opt-whitespace> : " " <opt-whitespace> | "" ## "" is empty string, i.e. no whitespace
<expression> : <list> | <list> "|" <expression>
<line-end> : <opt-whitespace> <EOL> | <line-end> <line-end>
<list> : <term> | <term> <opt-whitespace> <list>
<term> : <literal> | "<" <RULE-NAME> ">"
<literal> : '"' <TEXT> '"' | "'" <TEXT> "'" ## actually, the original BNF did not use quotes

以下是此语法如何用于表示基本JSON的示例(from the repo):

;; Simple baby example of JSON structure
json: number | string
| array
| object
number: NUMBER
string: STRING
array: "[" [json ("," json)*] "]"
object: "{" [kvpair ("," kvpair)*] "}"
kvpair: ID ":" json

有没有人知道他在用什么?如果可能,我想将其转换为Bison可读格式。

提前致谢。

1 个答案:

答案 0 :(得分:1)

它是一种扩展的BNF,类似于各种解析器生成器中使用的扩展BNF,大致基于野牛语法,添加了括号和正则表达式运算符。文档为here,摘要为:

  • 生产的左侧跟着,就像在野牛一样。
  • 在制作结束时没有; (在野牛中,; 是可选的。)
  • * + 是大多数正则表达式库中常见的Kleene星和加号运算符。 | 是通常的交替运算符。 是分组括号,也类似于大多数正则表达式实现。
  • 但是,可选序列被 [] 包围,类似于EBNF。

除了最后一点之外,例如,它与ANTLR使用的基本格式基本相同。