Phi*_*lds 12 python transform lexical-analysis
我想在这里加快我的发现过程,因为这是我第一次进入词汇分析世界.也许这甚至是错误的道路.首先,我将描述我的问题:
我有非常大的属性文件(大约有1,000个属性),在提炼时,它们实际上只有大约15个重要属性,其余的可以生成或很少更改.
所以,例如:
general {
name = myname
ip = 127.0.0.1
}
component1 {
key = value
foo = bar
}
Run Code Online (Sandbox Code Playgroud)
这是我想要创建的格式类型,用于标记类似于:
property.${general.name}blah.home.directory = /blah
property.${general.name}.ip = ${general.ip}
property.${component1}.ip = ${general.ip}
property.${component1}.foo = ${component1.foo}
Run Code Online (Sandbox Code Playgroud)
成
property.mynameblah.home.directory = /blah
property.myname.ip = 127.0.0.1
property.component1.ip = 127.0.0.1
property.component1.foo = bar
Run Code Online (Sandbox Code Playgroud)
词法分析和标记化听起来像是我最好的路线,但这是一种非常简单的形式.这是一个简单的语法,一个简单的替代,我想确保我没有带一个大锤敲钉子.
我可以创建自己的词法分析器和标记器,或ANTlr是可能的,但我不喜欢重新发明轮子和ANTlr听起来有点矫枉过正.
我不熟悉编译器技术,因此最理解指向正确方向和代码的指针.
注意:我可以更改输入格式.
Mat*_*son 12
在effbot.org上有一篇关于使用正则表达式进行词法分析的优秀文章.
使令牌化程序适应您的问题:
import re
token_pattern = r"""
(?P<identifier>[a-zA-Z_][a-zA-Z0-9_]*)
|(?P<integer>[0-9]+)
|(?P<dot>\.)
|(?P<open_variable>[$][{])
|(?P<open_curly>[{])
|(?P<close_curly>[}])
|(?P<newline>\n)
|(?P<whitespace>\s+)
|(?P<equals>[=])
|(?P<slash>[/])
"""
token_re = re.compile(token_pattern, re.VERBOSE)
class TokenizerException(Exception): pass
def tokenize(text):
pos = 0
while True:
m = token_re.match(text, pos)
if not m: break
pos = m.end()
tokname = m.lastgroup
tokvalue = m.group(tokname)
yield tokname, tokvalue
if pos != len(text):
raise TokenizerException('tokenizer stopped at pos %r of %r' % (
pos, len(text)))
Run Code Online (Sandbox Code Playgroud)
为了测试它,我们做:
stuff = r'property.${general.name}.ip = ${general.ip}'
stuff2 = r'''
general {
name = myname
ip = 127.0.0.1
}
'''
print ' stuff '.center(60, '=')
for tok in tokenize(stuff):
print tok
print ' stuff2 '.center(60, '=')
for tok in tokenize(stuff2):
print tok
Run Code Online (Sandbox Code Playgroud)
对于:
========================== stuff ===========================
('identifier', 'property')
('dot', '.')
('open_variable', '${')
('identifier', 'general')
('dot', '.')
('identifier', 'name')
('close_curly', '}')
('dot', '.')
('identifier', 'ip')
('whitespace', ' ')
('equals', '=')
('whitespace', ' ')
('open_variable', '${')
('identifier', 'general')
('dot', '.')
('identifier', 'ip')
('close_curly', '}')
========================== stuff2 ==========================
('newline', '\n')
('identifier', 'general')
('whitespace', ' ')
('open_curly', '{')
('newline', '\n')
('whitespace', ' ')
('identifier', 'name')
('whitespace', ' ')
('equals', '=')
('whitespace', ' ')
('identifier', 'myname')
('newline', '\n')
('whitespace', ' ')
('identifier', 'ip')
('whitespace', ' ')
('equals', '=')
('whitespace', ' ')
('integer', '127')
('dot', '.')
('integer', '0')
('dot', '.')
('integer', '0')
('dot', '.')
('integer', '1')
('newline', '\n')
('close_curly', '}')
('newline', '\n')
Run Code Online (Sandbox Code Playgroud)