【问题标题】:What is the BNF of BNF? i.e. How do we define a BNF meta-grammar?BNF的BNF是什么?即我们如何定义 BNF 元语法?
【发布时间】:2012-03-17 13:16:22
【问题描述】:

我正在尝试定义 BNF 的 BNF。换句话说,我试图定义 BNF 的元语法。也就是说,一个 BNF 文法是它自身的一个实例,并且可以生成任何其他 BNF 文法。

任何提示/提示/sn-ps 将不胜感激!

谢谢!

【问题讨论】:

  • wikipedia article on BNF似乎回答了你的问题。
  • @GregHewgill 有趣。 Frank de Remer 告诉我,BNF 无法描述自己。
  • @EJP:De Remer(是?)在解析器生成器和语法方面非常出色,我不相信他会教这些。我怀疑你有些记错了你学到的东西。
  • @IraBaxter 这正是他教给我的。
  • @EJP:所以,大概这个事实得到了一些不可能的证据的支持。你还记得吗?

标签: compiler-construction code-generation


【解决方案1】:

这是一个:

bnf = rules ;
rules = rule ;
rules = rules rule ;
rule = lefthandside EQUAL righthandside SEMICOLON  ;
lefthandside = IDENTIFIER ;
righthandside = ;
righthandside = righthandside token ;
token = IDENTIFIER ;
token = QUOTEDLITERAL ;

这使得 IDENTIFIER、QUOTEDLITERAL、EQUAL 和 SEMICOLON 未定义,在 假设 BNF 是在语言标记上定义的。

您可以在字符上定义 BNF。只需添加:

EQUAL = '=' ;
SEMICOLON = ';' ;
IDENTIFIER = letter ;
IDENTIFIER = IDENTIFIER letterordigit ;
letterordigit = letter ;
letterordigit = digit ;
letter = 'A' ;
...
letter = 'Z' ;
digit = '0' ;
...
digit = '9' ;

留给读者作为练习:添加选择 (|)、多条规则和 kleene 星号,使其成为 EBNF 的 BNF;这个答案显然对处理空白很不利,但是您可以通过在允许空白的地方插入“空白”非终结符来处理这个问题(讨厌但有效)。在 BNF 规范系统中,您实际上确实在字符上编写语法,并且为您完成了那种隐式的空白非终结符插入(例如,Stratego's "Syntax Definition Formalism")。

如果您想要关于 BNF 的关于 BNF 的令人兴奋的课程,您应该阅读 paper/do the tutorial,了解 1965 年的 BNF 处理系统,称为“MetaII”。本文介绍了如何在 BNF 中做 BNF,以及如何构建两个编译器,共 10 页。

(这里有一个重要的教训:阅读 60 年代和 70 年代的所有计算机科学资料。没有那么多,你会惊讶于有多少好的资料)。

【讨论】:

    【解决方案2】:
    <line> ::= '<' <word> '>' '::=' <definition>
    <definition> ::= <word> '|' | '' <definition> | ''
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多