python – 是否有可能用pyparsing解析非平凡的C枚举?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 是否有可能用pyparsing解析非平凡的C枚举?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2038字,纯文字阅读大概需要3分钟。
内容图文
![python – 是否有可能用pyparsing解析非平凡的C枚举?](/upload/InfoBanner/zyjiaocheng/817/48da182f94f14c6daef9a35d25f87ab1.jpg)
我有一个预处理的C文件,我需要枚举其中一个枚举的成员. pyparsing只有一个简单的例子(examples / cpp_enum_parser.py),但只有在枚举值为正整数时才有效.在现实生活中,值可以是负值,十六进制或复杂表达式.
我不需要结构化的值,只需要名称.
enum hello {
minusone=-1,
par1 = ((0,5)),
par2 = sizeof("a\\")bc};,"),
par3 = (')')
};
在解析值时,解析器应跳过所有内容,直到[(‘“,}]并处理这些字符.对于该正则表达式或SkipTo可能有用.对于字符串和字符 – QuotedString.对于嵌套括号 – 转发(examples / fourFn.py) )
解决方法:
改变了原来的例子.我不知道为什么他们从原始脚本中删除了enum.ignore(cppStyleComment).把它放回去.
from pyparsing import *
# sample string with enums and other stuff
sample = '''
stuff before
enum hello {
Zero,
One,
Two,
Three,
Five=5,
Six,
Ten=10,
minusone=-1,
par1 = ((0,5)),
par2 = sizeof("a\\")bc};,"),
par3 = (')')
};
in the middle
enum
{
alpha,
beta,
gamma = 10 ,
zeta = 50
};
at the end
'''
# syntax we don't want to see in the final parse tree
LBRACE,RBRACE,EQ,COMMA = map(Suppress,"{}=,")
lpar = Literal( "(" )
rpar = Literal( ")" )
anything_topl = Regex(r"[^'\"(,}]+")
anything = Regex(r"[^'\"()]+")
expr = Forward()
pths_or_str = quotedString | lpar + expr + rpar
expr << ZeroOrMore( pths_or_str | anything )
expr_topl = ZeroOrMore( pths_or_str | anything_topl )
_enum = Suppress('enum')
identifier = Word(alphas,alphanums+'_')
expr_topl_text = originalTextFor(expr_topl)
enumValue = Group(identifier('name') + Optional(EQ + expr_topl_text('value')))
enumList = Group(ZeroOrMore(enumValue + COMMA) + Optional(enumValue) )
enum = _enum + Optional(identifier('enum')) + LBRACE + enumList('names') + RBRACE
enum.ignore(cppStyleComment)
# find instances of enums ignoring other syntax
for item,start,stop in enum.scanString(sample):
for entry in item.names:
print('%s %s = %s' % (item.enum,entry.name, entry.value))
结果:
$python examples/cpp_enum_parser.py
hello Zero =
hello One =
hello Two =
hello Three =
hello Five = 5
hello Six =
hello Ten = 10
hello minusone = -1
hello par1 = ((0,5))
hello par2 = sizeof("a\")bc};,")
hello par3 = (')')
alpha =
beta =
gamma = 10
zeta = 50
内容总结
以上是互联网集市为您收集整理的python – 是否有可能用pyparsing解析非平凡的C枚举?全部内容,希望文章能够帮你解决python – 是否有可能用pyparsing解析非平凡的C枚举?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。