Compiler construction 什么是BNF的BNF?i、 我们如何定义BNF元语法?

Compiler construction 什么是BNF的BNF?i、 我们如何定义BNF元语法?,compiler-construction,code-generation,Compiler Construction,Code Generation,我试图定义BNF的BNF。换句话说,我试图定义BNF的元语法。也就是说,BNF语法本身就是一个实例,可以生成任何其他BNF语法 任何提示/提示/片段都将不胜感激 谢谢大家! 这里有一个: bnf = rules ; rules = rule ; rules = rules rule ; rule = lefthandside EQUAL righthandside SEMICOLON ; lefthandside = IDENTIFIER ; righthandside = ; rightha

我试图定义BNF的BNF。换句话说,我试图定义BNF的元语法。也就是说,BNF语法本身就是一个实例,可以生成任何其他BNF语法

任何提示/提示/片段都将不胜感激

谢谢大家!

这里有一个:

bnf = rules ;
rules = rule ;
rules = rules rule ;
rule = lefthandside EQUAL righthandside SEMICOLON  ;
lefthandside = IDENTIFIER ;
righthandside = ;
righthandside = righthandside token ;
token = IDENTIFIER ;
token = QUOTEDLITERAL ;
这使得标识符、QUOTEDLITERAL、等号和分号未定义在 假设BNF是在langauge令牌上定义的

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

EQUAL = '=' ;
SEMICOLON = ';' ;
IDENTIFIER = letter ;
IDENTIFIER = IDENTIFIER letterordigit ;
letterordigit = letter ;
letterordigit = digit ;
letter = 'A' ;
...
letter = 'Z' ;
digit = '0' ;
...
digit = '9' ;
留给读者一个练习:添加选择(|)、多重规则和kleene star,使其成为EBNF的BNF;这个答案显然是在处理空白方面做了手脚,但是你可以通过在任何允许空白的地方插入一个“blanks”非终结符来处理这个问题(讨厌但有效)。有一些BNF规范系统,您实际上是在字符上编写语法,这种隐式空白非终结符插入是为您完成的(例如,)

如果你想在BNF上一堂关于BNF的令人兴奋的课,你应该阅读从诚实到gosh 1965年的BNF处理系统的“MetaII”。本文描述了如何在BNF中进行BNF,以及如何构建两个编译器,共10页

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

:='':'':='
::=  '|' | ''  | ''

您的问题似乎得到了回答。@GregHewgill很有趣。弗兰克·德雷默(Frank de Remer)教我说BNF不能描述自己。@EJP:de Remer(是吗?)在解析器生成器和语法方面非常出色,我不相信他会教我这些。我怀疑你记错了所学的东西。@IraBaxter这正是他教给我的。@EJP:所以,这个事实大概有一些不可能的证据支持。你还记得吗?
<line> ::= '<' <word> '>' '::=' <definition>
<definition> ::= <word> '|' | '' <definition> | ''