【问题标题】:Translating Python's formal language into Rail Diagrams将 Python 的形式语言翻译成 Rail Diagrams
【发布时间】:2016-02-03 03:37:37
【问题描述】:

我目前正在尝试将 Python 的形式语法 (https://docs.python.org/3/reference/grammar.html) 翻译成 Rail Diagrams。 我们使用的网站http://www.bottlecaps.de/rr/ui 对其中的大部分内容都非常有帮助,我们已经手动更改了许多内容以创建正确的符号来创建铁路图,但仍有 50 多条线不正确且对我们来说非常困难修复,因为我们是全新的。有没有比手动更改更简单的方法?

注意该网站使用 EBNF

感谢您的宝贵时间,

【问题讨论】:

    标签: python diagram bnf ebnf


    【解决方案1】:

    编写解析语法的解析器,然后从解析树转换为所需的符号。

    转换本身相当简单:

    • 将“#”评论介绍人替换为“//”
    • 将 ':' 标记替换为 '::='
    • 用 '(' 替换 '[' 标记
    • 将“]”标记替换为“)?”

    一个合适的元语法,在W3C notation,是

    Grammar  ::= Rule+ EOF
    Rule     ::= Nonterminal ':' Alternatives
    Alternatives
             ::= Alternative ( '|' Alternative )*
    Alternative
             ::= ( Symbol ( '*' | '+' )? )*
    Symbol   ::= Nonterminal
               | Terminal
               | '(' Alternatives ')'
               | '[' Alternatives ']'
    
    <?TOKENS?>
    
    Nonterminal
             ::= [a-z] [a-z_]*
    Terminal ::= [A-Z] [A-Z_]*
               | "'" [^']+ "'"
    EOF      ::= $
    IgnorableWhitespace
             ::= [ #x9#xA#xD]+
               | '#' [^#xA]* [#xA]
              /* ws: definition */
    

    将其放入grammar.ebnf,然后使用REx为其创建解析器,编码例如在XQuery,使用这个命令行:

       -xquery -tree
    

    这将为您提供 XQuery 模块 grammar.xquery。接下来,把python语法放到python.grammar,这个XQuery程序放到transform.xquery

    import module namespace p="grammar" at "grammar.xquery";
    declare option saxon:output "method=text";
    declare variable $input as xs:string external;
    for $token in p:parse-Grammar(unparsed-text($input))//text()
    return
      if (starts-with(normalize-space($token), "#")) then
        replace($token, "((^|&#xA;)[\s])*#", "$1//")
      else
        switch ($token)
        case ":" return "::="
        case "[" return "("
        case "]" return ")?"
        default return $token
    

    然后使用Saxon 运行它:

      java net.sf.saxon.Query transform.xquery input=python.grammar > python.ebnf
    

    结果就是你想要的。

    当然,您也可以使用您喜欢的文本编辑器仔细地进行全局替换,以达到同样的效果。做对了会更有趣。

    【讨论】:

      最近更新 更多