Intellij idea Intellij idea BNF系列的末尾
我用来描述你的参数文件BNFIntellij 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不能是第一个符号”?如果是这样的话,这看起来很奇
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>