0

我试图了解如何使用 EBNF 来定义形式语法,特别是由空格分隔的单词序列,例如

<non-terminal> [<word>[ <word>[ <word>[ ...]]] <non-terminal>
  1. 定义单词终端的正确方法是什么?
  2. 表示所需空格的正确方法是什么?
  3. 可选的重复列表如何表示?
  4. 是否有任何关于 EBNF 的示例教程?

提前谢谢了!

4

1 回答 1

4

你必须决定你的词法分析器是否要为空格返回一个标记(终端)。您还必须决定它(词法分析器)将如何定义单词,或者您的语法是否会这样做(在这种情况下,词法分析器将作为终端返回什么?)。

剩下的,主要是理解 EBNF 表示法的精妙之处,这是一个 ISO 标准(ISO 14977:1996——它可以从免费提供的标准免费下载,你也可以从ISO获得) ,但这是一个在实践中很大程度上被忽略的标准。(我处理的语言——C、C++、SQL——在定义文档中使用 BNF 表示法,但在它们中的任何一种都不是 EBNF。)

  1. 无论你想对一个词做出正确的定义。例如,您需要考虑如何对待 name P. J. O'Neill。词法分析器会为此返回什么标记?
  2. 这与上一期密切相关;词法分析器要返回的终端是什么。
  3. 可选的重复列表用大括号括起来{}或者您可以使用 Kleene Star 表示法。
  4. 有一篇论文Extended BNF — RS Scowen 的通用基础标准解释了 EBNF。还有关于EBNF的维基百科条目。

我认为可以使用以下方法定义一个非空的、以空格分隔的单词列表:

non_empty_word_list = word { space word }

其中所有名称都是非终结符。您需要根据系统的相关终端来定义这些。

于 2012-10-03T19:15:01.420 回答