如何使用 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 等表示这些字母的垂直对齐方式?
进一步说明:
我这个问题的观点是寻找一种表示方法来表示代码的垂直对齐,而不仅仅是想知道如何编写 Python
或 Markdown
.
的 BNF 或 EBNF
您可以使用一些技巧来解析对缩进敏感的语言(如 Python 或 Haskell),这在 Python 语言参考的关于 lexical analysis。如前所述,词法分析器将前导空格转换为 INDENT
和 DEDENT
标记 [注 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
? ;
注释
词法分析器还将 一些 物理换行符转换为 NEWLINE
标记,同时使其他换行符消失。
EBNF 通常使用语法 =
而不是 ::=
进行产生式,并坚持以 ;
结束。评论包含在 (*
和 *)
.
之间
如何表示(在 BNF、EBNF 等中)任意两个或多个字母处于同一垂直对齐方式
例如在 python 2.x 中,我们有所谓的 indentation
.
def hello():
print "hello,"
print "world"
hello()
注意字母p
(第二行)与字母p
(第三行)
进一步的例子(降价):
MyHeader
========
topic
-----
注意 M
和第一个 =
放置在相同的垂直对齐中(还有 r
和最后一个 =
, t 和第一个 -
, c
和最后一个 -
)
我的问题是如何使用 BNF、EBNF 等表示这些字母的垂直对齐方式?
进一步说明:
我这个问题的观点是寻找一种表示方法来表示代码的垂直对齐,而不仅仅是想知道如何编写 Python
或 Markdown
.
您可以使用一些技巧来解析对缩进敏感的语言(如 Python 或 Haskell),这在 Python 语言参考的关于 lexical analysis。如前所述,词法分析器将前导空格转换为 INDENT
和 DEDENT
标记 [注 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
? ;
注释
词法分析器还将 一些 物理换行符转换为
NEWLINE
标记,同时使其他换行符消失。EBNF 通常使用语法
之间=
而不是::=
进行产生式,并坚持以;
结束。评论包含在(*
和*)
.