Parsing 用空格分隔的单词列表的EBNF语法

Parsing 用空格分隔的单词列表的EBNF语法,parsing,grammar,lexer,ebnf,Parsing,Grammar,Lexer,Ebnf,我试图理解如何使用EBNF来定义形式语法,特别是由空格分隔的单词序列,比如 <non-terminal> [<word>[ <word>[ <word>[ ...]]] <non-terminal> [[…]] 定义单词终端的正确方法是什么 表示所需空白的正确方法是什么 如何表示可选的重复列表 在EBNF的任何地方都有示例演示教程吗 非常感谢!您必须决定词法分析器是否将返回空格的标记(终端)。您还必须决定它(词法分析器)将如何定义单

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

<non-terminal> [<word>[ <word>[ <word>[ ...]]] <non-terminal>
[[…]]
  • 定义单词终端的正确方法是什么
  • 表示所需空白的正确方法是什么
  • 如何表示可选的重复列表
  • 在EBNF的任何地方都有示例演示教程吗

  • 非常感谢!

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

    对于其他人来说,这主要是理解EBNF表示法的细节的问题,这是一个ISO标准(ISO 14977:1996,可以从中免费下载,您也可以从中获得),但这是一个在实践中基本上被忽略的标准。(我处理的语言-C、C++、SQL在定义文档中使用BNF表示法,但它们中的任何一个都不EBNF)。
  • 无论你想对一个词做出正确的定义。例如,你需要考虑你想如何对待这个名字
    P.J.O'Neill
    。词法分析器会返回什么标记
  • 这与上一个问题密切相关;词法分析器将返回哪些终端
  • 可选重复列表包含在大括号中,也可以使用Kleene星形符号
  • 有一篇R.S.Scowen的论文解释了EBNF,还有维基百科上的条目
  • 我认为一个非空的、空格分隔的单词列表可以通过以下方式定义:

    non_empty_word_list = word { space word }
    

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

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

    对于其他人来说,这主要是理解EBNF表示法的细节的问题,这是一个ISO标准(ISO 14977:1996,可以从中免费下载,您也可以从中获得),但这是一个在实践中基本上被忽略的标准。(我处理的语言-C、C++、SQL在定义文档中使用BNF表示法,但它们中的任何一个都不EBNF)。
  • 无论你想对一个词做出正确的定义。例如,你需要考虑你想如何对待这个名字
    P.J.O'Neill
    。词法分析器会返回什么标记
  • 这与上一个问题密切相关;词法分析器将返回哪些终端
  • 可选重复列表包含在大括号中,也可以使用Kleene星形符号
  • 有一篇R.S.Scowen的论文解释了EBNF,还有维基百科上的条目
  • 我认为一个非空的、空格分隔的单词列表可以通过以下方式定义:

    non_empty_word_list = word { space word }
    

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

    谢谢Jonathan-您的答案正是我需要的。这也有助于回答我的其他一些问题,比如,我是否需要lexer阶段,如果不需要,我是否可以单次通过,甚至使用解析器组合器l图书馆。这么多问题。再次感谢!谢谢乔纳森-你的回答正是我所需要的。这也有助于回答我的其他一些问题,比如,我是否需要一个lexer阶段,如果不需要,我是否可以通过一个简单的过程,甚至可以使用解析器组合器库。这么多问题。再次感谢!