翻译Python';将形式语言转换为轨道图

翻译Python';将形式语言转换为轨道图,python,diagram,bnf,ebnf,Python,Diagram,Bnf,Ebnf,我目前正在尝试将Python的形式语法()翻译成轨道图。 我们正在使用的网站对大部分内容都很有帮助,我们已经手动更改了许多内容,以确定创建铁路图的正确符号,但仍有50多条线路不正确,我们很难修复,因为我们是全新的。有没有比手工改变更简单的方法 请注意,该网站使用EBNF 感谢您的时间,编写一个解析语法的解析器,然后从解析树转换为所需的符号 转换本身相当简单: 将“#”注释介绍人替换为“/” 将“:”标记替换为“:=” 将“[”标记替换为“(” 将“]”标记替换为“)?” 一个合适的元语法,在

我目前正在尝试将Python的形式语法()翻译成轨道图。 我们正在使用的网站对大部分内容都很有帮助,我们已经手动更改了许多内容,以确定创建铁路图的正确符号,但仍有50多条线路不正确,我们很难修复,因为我们是全新的。有没有比手工改变更简单的方法

请注意,该网站使用EBNF


感谢您的时间,

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

转换本身相当简单:

  • 将“#”注释介绍人替换为“/”
  • 将“:”标记替换为“:=”
  • 将“[”标记替换为“(”
  • 将“]”标记替换为“)?”
一个合适的元语法,在,是

这将为您提供XQuery模块
语法.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, "((^|
)[\s])*#", "$1//")
  else
    switch ($token)
    case ":" return "::="
    case "[" return "("
    case "]" return ")?"
    default return $token
然后使用来运行它:

  java net.sf.saxon.Query transform.xquery input=python.grammar > python.ebnf
结果就是你想要的

当然,你也可以使用你最喜欢的文本编辑器来仔细地做同样的事情。做对了就更有趣了

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, "((^|
)[\s])*#", "$1//")
  else
    switch ($token)
    case ":" return "::="
    case "[" return "("
    case "]" return ")?"
    default return $token
  java net.sf.saxon.Query transform.xquery input=python.grammar > python.ebnf