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

How to represent vertical alignment of syntax of code using BNF, EBNF or etc.?

如何表示(在 BNF、EBNF 等中)任意两个或多个字母处于同一垂直对齐方式

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

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

hello()

注意字母p(第二行)与字母p(第三行)

处于同一垂直对齐方式

进一步的例子(降价):

MyHeader
========
topic
-----

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

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

进一步说明: 我这个问题的观点是寻找一种表示方法来表示代码的垂直对齐,而不仅仅是想知道如何编写 PythonMarkdown.

的 BNF 或 EBNF

您可以使用一些技巧来解析对缩进敏感的语言(如 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很简单。

但是,您实际上不能将该算法编写为上下文无关语法,因为它不是上下文无关的。 (我将省略证明,但它类似于 a<sup>n</sup>b<sup>n</sup>c[=44= 的证明]n</sup> 不是上下文无关的,您可以在大多数初级正式语言教科书和整个互联网上找到它。)

ISO standard EBNF(提供免费 PDF)提供了一种包含“用户可能需要的扩展”的方法:Special-sequence,这是任何不包含 的文本? 两侧被 ? 包围。所以你可以通过包含 [Note 2]:

来滥用符号
DEDENT = ? See section 2.1.8 of https://docs.python.org/3.3/reference/ ? ;

或者您可以插入算法的完整描述。当然,这些技术都不允许解析器生成器生成准确的词法分析器,但它是向人类传达意图的合理方式 reader.

值得注意的是,EBNF 本身使用一个特殊的序列来定义其产生式之一:

(* see 4.7 *) syntactic exception
   = ? a syntactic-factor that could be replaced
       by a syntactic-factor containing no
       meta-identifiers
     ? ;

注释

  1. 词法分析器还将 一些 物理换行符转换为 NEWLINE 标记,同时使其他换行符消失。

  2. EBNF 通常使用语法 = 而不是 ::= 进行产生式,并坚持以 ; 结束。评论包含在 (**).

    之间