怎么说(在BNF,EBNF等)任何两个或多个字母都放在同一个垂直对齐中
例如在python 2.x中,我们称之为indentation
。
def hello():
print "hello,"
print "world"
hello()
注意字母p
(第二行)放置在字母p
(第三行)的相同垂直对齐方式
进一步的例子(降价):
MyHeader
========
topic
-----
注意 M
并且第一个=
放置在相同的垂直对齐方式(同时r
和最后=
,t和第一个{ {1}},-
和最后c
)
我的问题是如何使用BNF,EBNF等表示这些字母的垂直对齐?
进一步说明:
我对此问题的观点是搜索表示代码垂直对齐的表示方法,而不仅仅是想知道如何编写-
或Python
的BNF或EBNF。
答案 0 :(得分:10)
你可以通过使用一点hack来解析缩进敏感语言(比如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很简单。
但是,您实际上无法将该算法编写为无上下文语法,因为它不是无上下文的。 (我将省略证据,但它类似于anbncn
不是无上下文的证明,你可以在大多数基本的正式语言教科书和整个互联网上找到它。)
ISO standard EBNF(提供免费的PDF)提供了一种包含“用户可能需要的扩展程序”的方法:Special-sequence
,这是任何不包含的文本?两边被?包围。所以你可以通过加入[注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通常使用语法=
而不是::=
进行制作,并坚持使用;
终止它们。评论附在(*
和*)
之间。