我正在尝试定义BNF的BNF。换句话说,我试图定义BNF的元语法。也就是说,BNF语法是其自身的实例并且可以生成任何其他BNF语法。
任何提示/提示/片段都将受到高度赞赏!
谢谢!
答案 0 :(得分:6)
这是一个:
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;这个答案显然是处理空白的狡猾,但你可以通过插入“空白”非终结点来处理它,只要允许空白(icky但工作)。有BNF规范系统,你实际上在语法上写了语法,并且为你完成了那种隐式的空白非终结插入(例如,Stratego's "Syntax Definition Formalism")。
如果你想在BNF-about-BNF上学到一个令人兴奋的课程,你应该阅读paper/do the tutorial的BNF处理系统,从1965年的“诚实到天下”称为“MetaII”。本文描述了如何在BNF中进行BNF,以及如何在10个页面中构建两个编译器。
(这里有一个重要的教训:阅读60年代和70年代的所有计算机科学知识。没有那么多,你会对有多少好材料感到惊讶。)
答案 1 :(得分:0)
<line> ::= '<' <word> '>' '::=' <definition>
<definition> ::= <word> '|' | '' <definition> | ''