Intellij idea Intellij idea BNF系列的末尾

Intellij idea Intellij idea BNF系列的末尾,intellij-idea,bnf,ebnf,Intellij Idea,Bnf,Ebnf,我用来描述你的参数文件BNF root ::= commands * private commands ::= !<<eof>> (f_command | comments) {string_variable}* comments ::= LINE_COMMENT f_command ::= F 我不太确定你的指定是什么问题,但我有一些问题,关于其他一些我觉得不对的事情-也许其中之一就是它 你为什么有?这是否意味着“eof不能是第一个符号”?如果是这样的话,这看起来很奇

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

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

我不太确定你的指定是什么问题,但我有一些问题,关于其他一些我觉得不对的事情-也许其中之一就是它

  • 你为什么有
    ?这是否意味着“eof不能是第一个符号”?如果是这样的话,这看起来很奇怪,如果你需要
    ,那么你不也需要它来处理其他每一个无效的起始字符吗?这难道不意味着它对于任何其他产品来说都是有效的以
    开头吗?正如我所见,
    唯一有意义的地方是在第一部作品中,可能是这样的:

    root::=命令

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


  • 也不要用“*”来重复(如果你是这样做的话)——你必须把它纳入语法。我认为你想要的是语法上说“允许一个或多个连续的‘命令’生成”,如果是这样,那么实现这一点的一种方法可以如下所示:

    root ::= commands<<eof>>
    commands ::= commandsX
    X ::= private_command | epsilon
    private_command ::= <whatever you want this to be>
    
    root::=命令
    命令::=commandsX
    X::=private_命令| epsilon
    private_命令::=
    
    我认为这更接近你想要的。请记住,
    commands::=commandsX
    是左递归的,因此如果需要ll语法,您必须修复它。如果希望
    private\u命令
    接受任意数量的选项,请在定义
    private\u命令
    的产品时使用类似的方法

    我绝对不是这方面的专家,只是我感兴趣的东西,所以在某些方面我可能是错的。欢迎光临

    一些好的BNF参考资料:

    不确定您的应用程序是什么,但如果只是为了得到一个工作的解析器,您可以研究bison/yacc(两个非常相似的工具,用于解析,名称不同)和lex/flex(同样,两个类似的程序,名称不同,用于词法分析)。他们将为您编写语法分析器和词法分析器代码,但您需要一个合理的语法来提供它们


    1.!-这是一个错误。因为您编写了:root::=commands2,所以课程正确。行注释是多余的。它不会影响整体情况。我需要描述命令的结尾。否则,“command”后面的所有解析器都是command.OK,所以这个语法是没有意义的。非终端“private commands”不在任何地方使用。这是完整的语法,还是你排除了什么?如果你有完整的语法,告诉我,但是如果那是完整的语法,那么它永远不会起作用!也不要用“*”来重复——你必须把它纳入语法。例如,实现“commands”重复的一种方法如下:
    root::=commands
    commands::=commandsX
    X::=private_command | epsilon
    private_command::=(f|u command | comments){string_variable}
    我认为这更接近您想要的。请记住,
    commands::=commandsX
    是左递归的,因此如果需要ll语法,您必须修复它。啊,很抱歉,新行没有在注释中完成。我将编辑我的答案并添加它们。
    root ::= commands<<eof>>
    commands ::= commandsX
    X ::= private_command | epsilon
    private_command ::= <whatever you want this to be>