我用来描述您的参数文件BNF。
root ::= commands *
private commands ::= !<<eof>> (f_command | comments) {string_variable}*
comments ::= LINE_COMMENT
f_command ::= F我怎么才能实现BNF终点线呢?因为BNF不能理解参数F的结尾和参数注释的结尾(options参数可能很多)。与<< eof >>类推。
示例参数文件:
F option1 option2 optionN
C option1 option2 optionN发布于 2015-11-29 21:14:08
我不太清楚你指定的问题是什么,但我有一些问题,一些其他的事情看上去不对--也许其中之一就是!
!<<eof>>?这是否意味着"eof不能成为第一个符号“?如果是这样的话,这似乎很奇怪,如果您需要<<eof>>,那么您是否也需要它来处理其他每个无效的起始字符,这是否意味着其他任何产品都可以从<<eof>>开始呢?正如我所看到的,<<eof>>唯一有意义的地方就是第一次生产,也许是这样的:
root ::= commands<<eof>>也不要用“*”来重复(如果这就是你要做的事情)--你必须把它融入语法。我认为您希望语法能够说“允许一个或多个连续的‘命令’生成”,如果允许这样做,那么实现这一目标的一种方法可以如下所示:
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
NOt确定了您的应用程序是什么,但是如果只是为了获得一个工作的解析器,您可以查看bison / yacc (两个非常类似的diff工具)。名称,用于解析)和lex / flex (同样,两个具有diff的类似程序。姓名,用于词法)。他们将为您编写解析器和lexer代码,但您需要一个正常的语法才能给出它们。
https://stackoverflow.com/questions/33878238
复制相似问题