我试图用扩展的Backus Naur FormEBNF(BNF)来描述语法/语法,这是一个菜单项的配置文件菜单.conf使用缩进级别作为语法组件,如下例所示:
menu_entry_1
menu_entry_2
menu_entry_2_submenu_entry_1
menu_entry_2_submenu_entry_2
menu_entry_2_submenu_entry_2_subsubmenu_1
menu_entry_2_submenu_entry_2_subsubmenu_2
menu_entry_2_submenu_entry_3
menu_entry_3
menu_entry_3_submenu_entry_1
在上面的例子中,每个条目都用一个字符串表示,为了这个例子,它暗示/指示了它的位置。此外,示例应遵循以下规则
我提供BNF的尝试如下:
^{pr2}$因此,我的问题是关于我对递归声明的概念menu_entry
及其与submenu_entry
和{
知道python也使用缩进来创建块的概念,我想查找pythons语法的BNF/定义(如这里所示:https://docs.python.org/3/reference/grammar.html),但它将INDENT
和{
因此,我的问题是: 如何正确使用EBNF来描述将缩进用作分组块的语法/语法? 最好是一个小例子(或者如果可能的话纠正我的尝试)。在
在最好的情况下,EBNF将定义nesting-level
的概念{
当你需要一个语言创造者的头脑时,你可能在用一个程序员的头脑来思考。传统上创造一种语言有两个部分:
有些语言能够将语言创造过程中的词汇和句法部分结合起来,但在您的情况下这样做不是一个好主意,因为语法本身不能单独表达特定缩进的概念。这件事你得交给雷克瑟处理。在
下面是BNF语法,其中}都是lexer生成的终端值:
STRING
,NEWLINE
,INDENT
,和{很简单,对吧?我包含了
start
规则,以确保任何以NEWLINE
或DEDENT
标记结尾的文件都是有效的。如果没有它,以NEWLINE
标记结尾且前面没有STRING
标记的文件将无效。在我用了BNF,但如果你愿意,也可以很容易地使用EBNF。关键是lexer可以理解生成
INDENT
或DEDENT
标记(如果需要,可以使用错误),并且语法应该简单地指定如何使用生成的标记。在相关问题 更多 >
编程相关推荐