将Python的形式化语言转换为轨道图

2024-04-26 20:48:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试将Python的形式语法(https://docs.python.org/3/reference/grammar.html)翻译成轨道图。 我们正在使用的网站http://www.bottlecaps.de/rr/ui是非常有帮助的,它的大部分,我们已经改变了很多东西,用手fir正确的符号为它创建铁路图,但仍然有50+线是不正确的,我们很难修复,因为我们是全新的这个。有没有比手工改变更简单的方法呢?你知道吗

注意网站使用EBNF

谢谢你的时间


Tags: httpsorghttpdocs网站htmlwwwrr
1条回答
网友
1楼 · 发布于 2024-04-26 20:48:22

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

转换本身相当简单:

  • 将“#”注释介绍人替换为“//”
  • 将“:”标记替换为“::=”
  • 将“[”标记替换为“(”
  • 将“]”标记替换为“)?”你知道吗

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

结果就是你想要的。你知道吗

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

相关问题 更多 >