首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BNF的BNF是什么?也就是说,我们如何定义BNF元语法?

BNF的BNF是什么?也就是说,我们如何定义BNF元语法?
EN

Stack Overflow用户
提问于 2012-02-28 10:36:01
回答 2查看 2.6K关注 0票数 12

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

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-29 22:23:30

这里有一个:

代码语言:javascript
复制
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。只需添加:

代码语言:javascript
复制
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年代的所有计算机科学知识。它没有那么多,你会惊讶于有这么多好的材料)。

票数 8
EN

Stack Overflow用户

发布于 2017-02-07 08:53:12

代码语言:javascript
复制
<line> ::= '<' <word> '>' '::=' <definition>
<definition> ::= <word> '|' | '' <definition> | ''
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9475642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档