Intellij IDEA BNF 行尾

Intellij idea BNF end of line

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

root ::= commands *
private commands ::= !<<eof>> (f_command | comments) {string_variable}*
comments ::= LINE_COMMENT
f_command ::= F

如何实现BNF行尾? 因为BNF无法理解参数F的结束位置和参数注释的结束位置(options参数可能有很多)。 类比<>.

示例参数文件:

F option1 option2 optionN
C option1 option2 optionN

我不太确定你指定的问题是什么,但我有一些关于其他一些我认为不对的问题 - 也许其中之一就是问题!

  1. 为什么 'private commands' 的作品中有 !<<eof>>?这是否意味着“eof 不能是第一个符号”?如果是这样,那看起来很奇怪,如果你需要 <<eof>> 那么你是否也需要它来用于其他所有无效的起始字符,并且它不会表明它对任何其他作品有效从 <<eof>> 开始?正如我所见,<<eof>> 唯一有意义的地方是在第一部作品中,可能是这样的:

    root ::= commands<<eof>>

  2. 您在语法中加入注释对我来说也很奇怪。如果它们是注释,那么您的解析器就不需要它们,对吗?在词法分析阶段将它们过滤掉,然后您可以确保只有有效的标记才能通过解析器。当然,除非你正在创建一些我无法想象的系统,其中评论是有效的标记,并且是解析器所需要的:)。

也不要使用“*”表示重复(如果这是您正在做的)- 您必须将其纳入语法。我想你想要的是语法说“允许一个或多个连续的 'commands' 作品”如果是这样的话,那么实现这一目标的一种方法可能如下:

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

https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form

不确定你申请的是什么,但如果你的目的只是为了获得一个工作的解析器,你可以查看 bison / yacc(两个非常相似的工具,具有不同的名称,用于解析)和 lex / flex(再次,两个具有不同名称的相似程序,用于词法分析)。他们会为您编写解析器和词法分析器代码,但您需要给他们一个理智的语法。

https://github.com/westes/flex

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