بناء جملة مثل التعابير المنطقية أو CFG لتوليد منتج ديكارت من متغيرات السلسلة متسلسلة وحرفية

StackOverflow https://stackoverflow.com/questions/1015449

سؤال

وأنا أكتب جهاز محاكاة، وأود أن تشغيل الدراسات من خلال التذرع الكثير من الحالات من جهاز محاكاة، وذلك باستخدام مجموعات مختلفة من وسائط سطر الأوامر. لقد قرأت هذا السؤال وعدة أشخاص آخرين، ويبدو أنها قريبة، ولكن أنا 'م في الواقع لا تبحث عن بيانات عشوائية الوفاء باستخدام التعابير المنطقية معين، وأود مجموعة <م> جميع السلاسل التي تطابق التعبير المعتاد. ومن شأن ملف الإدخال المثال ننظر بشيء من هذا القبيل:

myprogram.{version1|version2} -arg1 {1|2|4} {-arg2|}

وأو:

myprogram.{0} -arg1 {1} {2}
0: "version1" "version2"
1: "1" "2" "4"
2: "-arg2" ""

ووستنتج:

myprogram.version1 -arg1 1 -arg2
myprogram.version1 -arg1 1
myprogram.version1 -arg1 2 -arg2
myprogram.version1 -arg1 2
myprogram.version1 -arg1 4 -arg2
myprogram.version1 -arg1 4
myprogram.version2 -arg1 1 -arg2
myprogram.version2 -arg1 1
myprogram.version2 -arg1 2 -arg2
myprogram.version2 -arg1 2
myprogram.version2 -arg1 4 -arg2
myprogram.version2 -arg1 4

وأتصور شيئا مثل هذا موجود بالفعل، وأنا لا أعرف المصطلح الصحيح للبحث عنها. أي مساعدة سيكون محل تقدير كبير. يمكنني تنفيذ تقنية مجردة أو خوارزمية نفسي إذا لزم الأمر، ولكن لو كان أداة الموجودة من قبل كنت تفضل أن يكون حرا (على الأقل كما هو الحال في البيرة) وتشغيل لينكس.

وأنا أعرف ربما سأرحل بعض التفاصيل بها، ويمكن أن تكون أكثر تحديدا حول الأشياء المناسبة إذا لزم الأمر، بدلا من إغراق الناس مع الكثير من التفاصيل في خط الهجوم. فمن الممكن تماما أن وانا ذاهب عن هذا بطريقة خاطئة، وأنا نرحب بجميع الحلول، حتى لو كانت حل مشكلتي بطريقة مختلفة.

والأهم من ذلك، أن هذا الحل لا يتطلب مني أن أكتب أي توزيع التعليمات البرمجية إضافية إذا كنت ترغب في إضافة المزيد من الخيارات حجة ل"عبر المنتج" سلاسل I توليد. لدي بالفعل النصي بيرل أن يفعل ذلك مع مجموعة من for متداخلة الحلقات على كل "متغير" التي يجب أن تتغير في كل مرة أغير عدد أو طبيعة المتغيرات.

هل كانت مفيدة؟

المحلول

وطالما لم يتم تداخل أقواس، والتعبيرات العادية سوف تعمل بشكل جيد. إذا كنت تحتاج إلى التعشيش، يمكنك إضافة بعض العودية إضافية في اللغة التنفيذ.

وهنا مثال في بيثون:

import re

def make_choices(template):
    pat = re.compile(r'(.*?)\{([^{}]+)\}',re.S)

    # tokenize the string
    last_end = 0
    choices = []
    for match in pat.finditer(template):
        prefix, alts = match.groups()
        if prefix:
            choices.append((prefix,)) # as a tuple
        choices.append(alts.split("|"))
        last_end = match.end()

    suffix = template[last_end:]
    if suffix:
        choices.append((suffix,))

    # recursive inner function
    def chooser(index):
        if index >= len(choices):
            yield []
        else:
            for alt in choices[index]:
                for result in chooser(index+1):
                    result.insert(0,alt)
                    yield result

    for result in chooser(0):
        yield ''.join(result)

مثال:

>>> for result in make_choices('myprogram.{version1|version2} -arg1 {1|2|4} {-arg2|}'):
...     print result
...
myprogram.version1 -arg1 1 -arg2
myprogram.version1 -arg1 1
myprogram.version1 -arg1 2 -arg2
myprogram.version1 -arg1 2
myprogram.version1 -arg1 4 -arg2
myprogram.version1 -arg1 4
myprogram.version2 -arg1 1 -arg2
myprogram.version2 -arg1 1
myprogram.version2 -arg1 2 -arg2
myprogram.version2 -arg1 2
myprogram.version2 -arg1 4 -arg2
myprogram.version2 -arg1 4

هل يمكن استخدام os.system() لتنفيذ الأوامر من داخل بيثون:

#!/etc/env python
import sys, os

template = ' '.join(sys.args)
failed = 0
total = 0
for command in make_choices(template):
    print command
    if os.system(command):
        print 'FAILED'
        failed += 1
    else:
        print 'OK'
    total += 1

print
print '%d of %d failed.' % (failed,total)

sys.exit(failed > 0)

وبعد ذلك على سطر الأوامر:

user:/home/> template.py 'program.{version1|version2}'
program.version1
OK
program.version2
FAILED

1 of 2 failed.

نصائح أخرى

وأنت لا حقا تبحث عن شيء التي تم تصميمها التعابير العادية ل. كنت تبحث فقط عن أداة الذي يولد مجموعات من خيارات منفصلة.

واعتمادا على كل مجموعة من الحجج الممكنة، قائمة شاملة من مجموعات قد لا يكون في الواقع ضرورية. بغض النظر، يجب أن ننظر إلى البشرى اختبار . أنا أعرف حقيقة أن أداة PICT يمكن أن تولد أنت إما قائمة شاملة أو قائمة البشرى من حالات الاختبار التي تريدها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top