我继承了一堆看起来像这样的测试脚本:
// make connection on standard port (FD) ot 11 02 00 0F FD // wait for ACK in 12 ackValue // wait for connection confirmation in 13 ackValue 09 88 //send 5 bytes of arbitary data ot 21 ackValue 05 01 02 03 04 05
等等。
我想编写自己的simpiler测试脚本,它是上面的一层,可以解析为自动生成上面的脚本,这样我的脚本看起来像这样:
MAKE_STANDARD_CONNECTION SEND_DATA (01,02,03,04,05)
因此,当解析MAKE_STANDARD_CONNECTION时,它将在前一个脚本中生成前六行。这将允许我快速更新所有脚本,如果标准端口应从0xFD更改为其他...
我猜测有可用的工具,但它们是什么?我是一名程序员,所以我可以编写这个代码,如果需要python作为我选择的语言。
感谢您的帮助,
百里
答案 0 :(得分:9)
对于这样的简单测试,您不需要任何特殊的解析器。只需使用Python。一个简单的解决方案可以这样开始:
class TestGen(object):
def __init__(self, filename):
self._filename = filename
def __enter__(self):
self._file = open(self._filename, 'w')
return self
def __exit__(self, *args):
self._file.close()
def make_standard_connection(self):
self._write('ot 11 02 00 0F FD')
self._write('in 12 ackValue')
self._write('in 13 ackValue 09 88')
def send_data(self, *data):
data_str = ' '.join(data)
self._write('ot 21 ackValue 05 %s' % (data_str,))
def _write(self, line):
self._file.write('%s\n' % line)
def script_one():
with TestGen('output1.txt') as g:
g.make_standard_connection()
g.send_data('01', '02', '03', '04', '05')
运行script_one()
将生成包含以下内容的文件:
ot 11 02 00 0F FD
in 12 ackValue
in 13 ackValue 09 88
ot 21 ackValue 05 01 02 03 04 05
答案 1 :(得分:3)
我建议您在Python之上将其实现为内部DSL 。成功:
MAKE_STANDARD_CONNECTION()
SEND_DATA('01','02','03','04','05')
它是真正的Python代码,可以自动生成您的专有脚本。 Python非常易读且编写起来很舒服,通过将其作为内部DSL,您可以随意使用Python的所有功能。例如,你可以这样做:
values = [somefunc(i) for i in range(5)]
MAKE_STANDARD_CONNECTION()
SEND_DATA(*values)
somefunc
是任意计算。要在外部DSL(即您自己的脚本语言)中实现这一点,您必须实现循环和更多结构。 Python免费为您提供此功能,这只是功能的一个小例子。
如果这听起来很有趣,可以通过谷歌搜索“外部DSL”与“内部DSL”来了解我正在谈论的内容。在这个世界上有足够的奇怪的,专有的,执行不佳的“脚本语言”。生下另一个通常是一个坏主意。
答案 2 :(得分:2)