我正在尝试定义BNF的BNF。换句话说,我正在尝试定义BNF的元文法。也就是说,BNF文法是其自身的一个实例,可以生成任何其他BNF文法。
任何提示/提示/片段都将不胜感激!
谢谢!
发布于 2012-02-29 22:23:30
这里有一个:
bnf = rules ;
rules = rule ;
rules = rules rule ;
rule = lefthandside EQUAL righthandside SEMICOLON ;
lefthandside = IDENTIFIER ;
righthandside = ;
righthandside = righthandside token ;
token = IDENTIFIER ;
token = QUOTEDLITERAL ;这使得标识符QUOTEDLITERAL,EQUAL和分号未定义,假设BNF是在langauge标记上定义的。
您可以在字符上定义BNF。只需添加:
EQUAL = '=' ;
SEMICOLON = ';' ;
IDENTIFIER = letter ;
IDENTIFIER = IDENTIFIER letterordigit ;
letterordigit = letter ;
letterordigit = digit ;
letter = 'A' ;
...
letter = 'Z' ;
digit = '0' ;
...
digit = '9' ;留给读者作为练习:添加选项(|)、多个规则和kleene星号,使其成为EBNF的BNF;这个答案显然是在处理空格时偷工减料,但你可以通过在允许空格的地方插入一个" blanks“非终结符来处理它(虽然很麻烦,但很有效)。在一些BNF规范系统中,您实际上是在字符上编写语法,并且这种隐式的空格非末尾插入是为您完成的(例如,Stratego's "Syntax Definition Formalism" )。
如果你想在BNF-about-BNF上一堂令人兴奋的课,你应该阅读1965年“老实说”中关于BNF处理系统的paper/do the tutorial,叫做"MetaII“。本文描述了如何在BNF中实现BNF,以及如何构建两个编译器,总共10页。
(这里的一个重要教训是:阅读60年代和70年代的所有计算机科学知识。它没有那么多,你会惊讶于有这么多好的材料)。
发布于 2017-02-07 08:53:12
<line> ::= '<' <word> '>' '::=' <definition>
<definition> ::= <word> '|' | '' <definition> | ''https://stackoverflow.com/questions/9475642
复制相似问题