python - 使用 simpleparse EBNF 解析 nuke 脚本

标签 python parsing ebnf nuke

我正在尝试使用以下 EBNF 传递一个 nuke 脚本(foundry .nk 文件),但我似乎在我的“内容”文字中捕获了太多内容。此外,我很确定我在格式化时犯了一些主要的菜鸟错误。谁能帮帮我?

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]*

核脚本:

#! /opt/foundry/Nuke/6.3v7-x64/Nuke6.3 -nx
version 6.3 v7
Root {
 inputs 0
 name /path/to/file_name.nk
 first_frame 0
 last_frame 100
 lock_range true
 format "2048 1556 0 0 2048 1556 1 2K_Super_35(full-ap)"
 proxy_type scale
 proxy_format "1024 778 0 0 1024 778 1 1K_Super_35(full-ap)"
 addUserKnob {20 custom l Custom}
 addUserKnob {1 scene l Scene}
 views {
  {left ""}
  {right ""}
 }
}

当前的 EBNF 阻塞在“ View ”旋钮值上。通过从节点中删除它,我的代码按预期工作。我的完整代码在这里:http://pastebin.com/z01RWpqW

谢谢

最佳答案

这是固定声明:

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. node 可能以\n 结尾,所以这就是为什么您需要将 '\n'* 附加到节点定义
  2. multiknobgroup 定义不允许以 }\n 结尾,因为\n 由节点内容定义(键值\n)附加,并且会导致 multiknobgroup 不匹配连同节点内容

关于python - 使用 simpleparse EBNF 解析 nuke 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12792198/

相关文章:

lisp - 阅读和理解 Common Lisp (HyperSpec) 文档

parsing - 将 EBNF 转换为 BNF 以用于 LALR 解析器

python - 从 python-2.5 升级到 2.7 时带有 HTTPS 回归的 urllib2.ProxyHandler

javascript - 导入文件预览

iphone - 解析问题

java - 使用jsoup从两个标签之间提取不明的html内容?正则表达式?

Python脚本,记录到屏幕和文件

python - Keras 输入数据格式

python - 如何将日期选择器放入 django 应用程序中?

parsing - 使用 DCG 在 EBNF 的 Prolog 中实现 DSL 的困难