使用simpleparse EBNF解析nuke脚本

2024-09-29 23:16:15 发布

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

我试图用下面的EBNF传递一个nuke脚本(foundry.nk文件),但是我似乎在我的“content”文本中捕捉了太多。我也很确定我在格式上犯了一些大错误。有谁能帮我一把吗?在

EBNF:

file           := header, content
header         := shebang, version
shebang        := '#!', ts, word, ('-',[a-zA-Z0-9]+)?,'\n'
version        := 'version', ts, [0-9], '.', [0-9], ts, 'v', [0-9], '\n'
content        := node*
node           := word, ts, '{\n', nodecontent*, '}\n'
nodecontent    := ts, knobname, ts, knobvalue, '\n'
knobname       := word
knobvalue      := word / string / multiknobgroup / knobgroup
knobgroup      := '{', (word / string, ts)*, '}'
multiknobgroup := '{\n', (ts, knobgroup, '\n')*, ts, '}\n'
string         := '"', word*, '"'
word           := ([a-zA-Z0-9-_()/\~.<>?;:])+,ts
ts             := [ \t]*

Nukescript:

^{pr2}$

当前的EBNF被“views”knobvalue阻塞了。通过将其从节点中移除,我的代码可以按预期工作。我的完整代码在这里:http://pastebin.com/z01RWpqW

谢谢


Tags: nodestringversioncontentwordheadertsshebang
1条回答
网友
1楼 · 发布于 2024-09-29 23:16:15

这是固定的声明:

declaration = """
file           := header, content
header         := shebang, version
shebang        := '#!', ts, word, ('-',[a-zA-Z0-9]+)?,'\n'
version        := 'version', ts, [0-9], '.', [0-9], ts, 'v', [0-9], '\n'

content        := node*
node           := word, ts, '{\n', nodecontent*, ts, '}', '\n'*
nodecontent    := ts, knobname, ts, knobvalue, '\n'
knobname       := word
knobvalue      := word / string / multiknobgroup / knobgroup
knobgroup      := '{', (word / string)*, ts, '}'
multiknobgroup :=  '{\n', (ts, knobgroup, '\n')*, ts, '}'
string         := '"', word*, '"'
word           := ([a-zA-Z0-9-_()/\~.<>?;:])+,ts
ts             := [ \t]*
"""
  1. 节点可能以\n结尾,因此您需要将“\n”*附加到节点定义中
  2. multiknobgroup定义以}结尾,因为\n后面有nodecontent定义(键值\n),并且会导致multiknobgroup与nodecontent不匹配

相关问题 更多 >

    热门问题