语言语法的例子,缩进级别定义了一个块?

2024-09-30 14:17:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用扩展的Backus Naur FormEBNFBNF)来描述语法/语法,这是一个菜单项的配置文件菜单.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和{}的相关概念排除在is语法之外。在

因此,我的问题是: 如何正确使用EBNF来描述将缩进用作分组块的语法/语法? 最好是一个小例子(或者如果可能的话纠正我的尝试)。在

在最好的情况下,EBNF将定义nesting-level的概念{},即:1表示子菜单项,2表示子菜单项。。。。在


Tags: 概念定义语法例子menuentry菜单项ebnf
1条回答
网友
1楼 · 发布于 2024-09-30 14:17:39

当你需要一个语言创造者的头脑时,你可能在用一个程序员的头脑来思考。传统上创造一种语言有两个部分:

  1. Lexeme规范:定义表示单个语法结构(即标记或终值)的字符组
  2. 语法规范:定义语法结构/标记/终结值的有效组合,这些组合构成表示语言如何使用的非终结值

有些语言能够将语言创造过程中的词汇和句法部分结合起来,但在您的情况下这样做不是一个好主意,因为语法本身不能单独表达特定缩进的概念。这件事你得交给雷克瑟处理。在

下面是BNF语法,其中STRINGNEWLINEINDENT,和{}都是lexer生成的终端值:

start ::= list
        | list NEWLINE
        .

list  ::= entry
        | list entry
        .

entry ::= STRING NEWLINE
        | STRING NEWLINE INDENT list DEDENT
        .

很简单,对吧?我包含了start规则,以确保任何以NEWLINEDEDENT标记结尾的文件都是有效的。如果没有它,以NEWLINE标记结尾且前面没有STRING标记的文件将无效。在

我用了BNF,但如果你愿意,也可以很容易地使用EBNF。关键是lexer可以理解生成INDENTDEDENT标记(如果需要,可以使用错误),并且语法应该简单地指定如何使用生成的标记。在

相关问题 更多 >