fro*_*hem 8 syntax indentation bnf ebnf vertical-text
怎么说(在BNF,EBNF等中)任何两个或多个字母都放在同一个垂直对齐中
例如在python 2.x中,我们有我们所说的indentation.
def hello():
print "hello,"
print "world"
hello()
Run Code Online (Sandbox Code Playgroud)
注意字母p(第二行)放置在相同的垂直对齐字母p(第三行)
进一步的例子(降价):
MyHeader
========
topic
-----
Run Code Online (Sandbox Code Playgroud)
注意 M和第一个=放在相同的垂直对齐方式(也是r最后一个=,t和第一个-,c最后一个-)
我的问题是如何使用BNF,EBNF等表示这些字母的垂直对齐?
此外,注意:
我对这个问题的一点是寻找一种表示方法来表示的代码垂直排列,不只是想知道如何编写BNF或EBNF Python或Markdown.
ric*_*ici 10
您可以使用一个小的hack来解析缩进敏感语言(如Python或Haskell),这在Python语言参考的词法分析章节中有详细描述.如所描述的,词法分析器匝前导空白为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]
Run Code Online (Sandbox Code Playgroud)
因此,如果您准备描述(或参考)词法分析算法,BNF很简单.
但是,您实际上无法将该算法编写为无上下文语法,因为它不是无上下文的.(我将省略证据,但它类似于不具有上下文的证据,您可以在大多数基本的正式语言教科书中找到它,并且可以在整个互联网上找到.)anbncn
ISO标准EBNF(提供免费的PDF)提供了一种包括"用户可能需要的扩展"的方式:a Special-sequence,这是任何不包含?两侧的文本的文本?.所以你可以通过加入[注2]来滥用这种表示法:
DEDENT = ? See section 2.1.8 of https://docs.python.org/3.3/reference/ ? ;
Run Code Online (Sandbox Code Playgroud)
或者您可以插入算法的完整描述.当然,这些技术都不允许解析器生成器生成准确的词法分析器,但这是将意图传达给人类读者的合理方式.
值得注意的是,EBNF本身使用特殊序列来定义其中一个产品:
(* see 4.7 *) syntactic exception
= ? a syntactic-factor that could be replaced
by a syntactic-factor containing no
meta-identifiers
? ;
Run Code Online (Sandbox Code Playgroud)
词法分析器还将一些物理换行符转换为NEWLINE标记,同时使其他换行符消失.
EBNF通常使用语法=而不是::=生产,并坚持使用它们终止;.评论包含在(*和之间*).
| 归档时间: |
|
| 查看次数: |
1143 次 |
| 最近记录: |