我试图记录我在
在上面的示例中,每个条目都由一个字符串表示,为了示例的方便,该字符串表示其位置。此外,示例应遵循以下规则:
知道Python也使用缩进来创建块的概念,我想查找Python语法的BNF /定义(在此处找到:https://docs.python.org/3/reference/grammar.html),但它将
menuentries.conf
中使用的语法,这是一个用于菜单条目的配置文件,通过使用称为扩展Backus-Naur-Form EBNF(BNF)的符号说明法来描述语法/语法。此menuentries.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
在上面的示例中,每个条目都由一个字符串表示,为了示例的方便,该字符串表示其位置。此外,示例应遵循以下规则:
- 每个菜单项都由一行表示(因此菜单条目由NEWLINE分隔)
- 没有任何缩进的菜单条目是“顶级”菜单条目
- 具有缩进的菜单条目不是“顶级”,而是相应更高/上级菜单条目的子条目。
我提供BNF的尝试如下:
NEWLINE:= '\n' INDENTING:= ' ' menu_entry_string:=('a'|'b'|....|'z'|'_'|'0'|'1'|...|'9')+ menu_entries:= menu_entry(NEWLINE menuentry)* menu_entry:= menu_entry_string(NEWLINE INDENTING menu_entry)* submenu_entry:= INDENTING menu_entry_string subsubmenu_entry:= INDENTING INDENTING menu_entry_string我的问题是关于我对递归声明的“menu_entry”概念及其与“submenu_entry”和“subsubmenu_entry”的冗余不满。
知道Python也使用缩进来创建块的概念,我想查找Python语法的BNF /定义(在此处找到:https://docs.python.org/3/reference/grammar.html),但它将
INDENT
和DEDENT
的相关概念留了下来。
因此,我的问题是: 如何正确地使用EBNF描述使用缩进作为分组块的语法/语法? 最好提供一个小例子(或者如果可能的话纠正我的尝试)。
在最理想的情况下,EBNF将定义“嵌套级别”的“块”概念,其中“submenu_entry”的级别为1,“subsubmenu_entry”的级别为2....
INDENT
和DEDENT
,因为它们所表示的空格数量会有所变化。 - user539810