2024-04-26 20:48:22 发布
网友
我目前正在尝试将Python的形式语法(https://docs.python.org/3/reference/grammar.html)翻译成轨道图。 我们正在使用的网站http://www.bottlecaps.de/rr/ui是非常有帮助的,它的大部分,我们已经改变了很多东西,用手fir正确的符号为它创建铁路图,但仍然有50+线是不正确的,我们很难修复,因为我们是全新的这个。有没有比手工改变更简单的方法呢?你知道吗
注意网站使用EBNF
谢谢你的时间
编写解析语法的解析器,然后从解析树转换为所需的符号。你知道吗
转换本身相当简单:
在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中使用以下命令行进行编码:
grammar.ebnf
-xquery -tree
这将为您提供XQuery模块grammar.xquery。接下来,将python语法放在python.grammar,将这个XQuery程序放在transform.xquery:
grammar.xquery
python.grammar
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
然后使用Saxon运行它:
java net.sf.saxon.Query transform.xquery input=python.grammar > python.ebnf
结果就是你想要的。你知道吗
当然,你也可以使用你最喜欢的文本编辑器来仔细地做同样的事情。做对了就有趣多了。你知道吗
编写解析语法的解析器,然后从解析树转换为所需的符号。你知道吗
转换本身相当简单:
在W3C notation中,合适的元语法是
将其放入
grammar.ebnf
,然后使用REx为其创建一个解析器,例如在XQuery中使用以下命令行进行编码:这将为您提供XQuery模块
grammar.xquery
。接下来,将python语法放在python.grammar
,将这个XQuery程序放在transform.xquery
:然后使用Saxon运行它:
结果就是你想要的。你知道吗
当然,你也可以使用你最喜欢的文本编辑器来仔细地做同样的事情。做对了就有趣多了。你知道吗
相关问题 更多 >
编程相关推荐