首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Intellij idea BNF线路末端

Intellij idea BNF线路末端
EN

Stack Overflow用户
提问于 2015-11-23 18:41:37
回答 1查看 626关注 0票数 1

我用来描述您的参数文件BNF。

代码语言:javascript
复制
root ::= commands *
private commands ::= !<<eof>> (f_command | comments) {string_variable}*
comments ::= LINE_COMMENT
f_command ::= F

我怎么才能实现BNF终点线呢?因为BNF不能理解参数F的结尾和参数注释的结尾(options参数可能很多)。与<< eof >>类推。

示例参数文件:

代码语言:javascript
复制
F option1 option2 optionN
C option1 option2 optionN
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-29 21:14:08

我不太清楚你指定的问题是什么,但我有一些问题,一些其他的事情看上去不对--也许其中之一就是!

  1. 为什么在“私有命令”的生产中有!<<eof>>?这是否意味着"eof不能成为第一个符号“?如果是这样的话,这似乎很奇怪,如果您需要<<eof>>,那么您是否也需要它来处理其他每个无效的起始字符,这是否意味着其他任何产品都可以从<<eof>>开始呢?正如我所看到的,<<eof>>唯一有意义的地方就是第一次生产,也许是这样的: root ::= commands<<eof>>
  2. 在我看来,你在语法中包含了注释,这似乎也很奇怪。如果它们是注释,那么解析器就不需要它们了,对吗?在词法分析阶段过滤掉它们,然后可以确保只有有效的标记才能通过解析器。当然,除非您正在创建一个我无法想象的系统,其中注释是有效的标记,解析器需要这样的标记:)。

也不要用“*”来重复(如果这就是你要做的事情)--你必须把它融入语法。我认为您希望语法能够说“允许一个或多个连续的‘命令’生成”,如果允许这样做,那么实现这一目标的一种方法可以如下所示:

代码语言:javascript
复制
root ::= commands<<eof>>
commands ::= commandsX
X ::= private_command | epsilon
private_command ::= <whatever you want this to be>

我觉得这更接近你想要的。请记住,commands ::= commandsX是递归的,所以如果需要LL语法,就必须修复它。如果希望private_command接受任意数量的选项,那么在为private_command定义产品时,只需使用类似的方法即可。

我绝不是这方面的专家,只是我感兴趣的东西,所以我可能会对其中的一些错误。欢迎教改!

一些良好的BNF参考资料:

http://marvin.cs.uidaho.edu/Teaching/CS445/grammar.html

Form

NOt确定了您的应用程序是什么,但是如果只是为了获得一个工作的解析器,您可以查看bison / yacc (两个非常类似的diff工具)。名称,用于解析)和lex / flex (同样,两个具有diff的类似程序。姓名,用于词法)。他们将为您编写解析器和lexer代码,但您需要一个正常的语法才能给出它们。

https://github.com/westes/flex

https://www.gnu.org/software/bison/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33878238

复制
相关文章

相似问题

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