gpt4 book ai didi

syntax - 如何使用 BNF、EBNF 等表示代码语法的垂直对齐?

转载 作者:行者123 更新时间:2023-12-04 06:59:59 28 4
gpt4 key购买 nike

怎么说(在 BNF、EBNF 等中)任意两个或多个字母放置在相同的垂直对齐中

例如在 python 2.x 中,我们有我们所说的 indentation .

def hello():
print "hello,"
print "world"

hello()

备注 来信 p (第二行)与字母 p 的垂直对齐方式相同(第三行)

进一步的例子(在 Markdown ):
MyHeader
========
topic
-----

备注 M和第一个 =放置在相同的垂直对齐中(还有 r 和最后一个 = , t 和第一个 -c 和最后一个 - )

我的问题是 如何使用 BNF、EBNF 等来表示这些字母的垂直对齐方式?

进一步说明:
我这个问题的重点是寻找一种表示方法来表示代码的垂直对齐,而不仅仅是想知道如何写 Python的BNF或EBNF。或 Markdown .

最佳答案

您可以使用一个小技巧来解析对缩进敏感的语言(如 Python 或 Haskell),这在 Python 语言引用的 lexical analysis 章节中有详细描述。 .如上所述,词法分析器将前导空格转换为 INDENTDEDENT标记 [注 1],然后以简单的方式在 Python 语法中使用。这是一个小摘录:

suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement ::= stmt_list NEWLINE | compound_stmt
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
while_stmt ::= "while" expression ":" suite ["else" ":" suite]
因此,如果您准备描述(或引用)词法分析算法,BNF 很简单。
但是,您实际上不能将该算法编写为上下文无关文法,因为它不是上下文无关的。 (我将省略证明,但它类似于证明 anbncn 不是上下文无关的,您可以在大多数初级正式语言教科书中和互联网上找到。)
ISO standard EBNF (有免费的 PDF 可用)提供了一种包含“用户可能需要的扩展”的方法:a Special-sequence , 哪个文本不包含 ?两边用 ? 包围。因此,您可以通过包含 [Note 2] 来滥用该符号:
DEDENT = ? See section 2.1.8 of https://docs.python.org/3.3/reference/ ? ;
或者您可以插入算法的完整描述。当然,这两种技术都不允许解析器生成器生成准确的词法分析器,但它是向人类读者传达意图的合理方式。
值得注意的是,EBNF 本身使用一个特殊的序列来定义其产生式之一:
(* see 4.7 *) syntactic exception
= ? a syntactic-factor that could be replaced
by a syntactic-factor containing no
meta-identifiers
? ;

笔记
  • 词法分析器还将一些物理换行符转换为 NEWLINE标记,同时使其他换行符消失。
  • EBNF 通常使用语法 =而不是 ::=用于制作,并坚持以 ; 终止它们.评论包含在 (* 之间和 *) .
  • 关于syntax - 如何使用 BNF、EBNF 等表示代码语法的垂直对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27786191/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com