【问题标题】:EBNF Grammar for list of words separated by a space用空格分隔的单词列表的 EBNF 语法
【发布时间】:2012-10-03 16:07:13
【问题描述】:

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

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

非常感谢!

【问题讨论】:

    标签: parsing grammar lexer ebnf


    【解决方案1】:

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

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

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

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

    non_empty_word_list = word { space word }
    

    所有的名字都是非终结符。您需要根据系统的相关终端来定义它们。

    【讨论】:

    • 谢谢乔纳森 - 你的回答正是我所需要的。它还有助于回答我的其他一些问题,例如,我是否需要词法分析器阶段,如果不需要,我是否可以一次通过,甚至可以使用解析器组合器库。这么多的问题。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多