Tôi đang viết một trình phân tích cú pháp con xúc xắc tùy chỉnh (snicker nếu bạn phải) trong python. Về cơ bản, tôi muốn sử dụng đánh giá toán học tiêu chuẩn nhưng thêm 'd' điều hành:Cách đánh giá một biểu thức toán học tùy chỉnh trong Python
#xdy
sum = 0
for each in range(x):
sum += randInt(1, y)
return sum
Vì vậy, ví dụ, 1d6 2d6 + + 2d6-72 + 4d100 = (5) + (1 + 1) + (6 + 2) -72+ (5 + 39 + 38 + 59) = 84
Tôi đã sử dụng regex để thay thế tất cả 'd bằng tổng và sau đó sử dụng eval, nhưng regex của tôi bị phân tách khi xử lý dấu ngoặc đơn hai bên. Có cách nào nhanh hơn để thực hiện việc này hơn là triển khai phân tích cú pháp đệ quy của riêng tôi không? Có lẽ thêm một toán tử vào eval?
Chỉnh sửa: Tôi dường như đã đưa ra một ví dụ không tốt, vì ví dụ trên hoạt động với phiên bản hiện tại của tôi. Những gì tôi đang tìm kiếm là một số cách để đánh giá, nói, (5+ (6d6)) d (7-2 * (1d4)).
Bằng cách "tách rời", tôi chỉ có nghĩa là biểu thức chính quy hiện tại của tôi không thành công. Tôi đã quá mơ hồ về sự thất bại của tôi, xin lỗi vì sự nhầm lẫn. Đây là mã hiện tại của tôi:
def evalDice(roll_matchgroup):
roll_split = roll_matchgroup.group('roll').split('d')
print roll_split
roll_list = []
for die in range(int(roll_split[0])):
roll = random.randint(1,int(roll_split[1]))
roll_list.append(roll)
def EvalRoll(roll):
if not roll: return 0
rollPattern = re.compile('(?P<roll>\d*d\d+)')
roll_string = rollPattern.sub(evalDice, roll.lower())
cho điều này, "1d6 + 4d100" làm việc tốt, nhưng "(1d6 +4) D100" hoặc thậm chí "1d6 + 4d (100)" thất bại.
Bạn có thể cho chúng tôi thấy những gì bạn đã thử và cách nó không thành công? –
Kết thúc chỉ cần tạo một hàm trợ giúp đệ quy. Cảm ơn vì sự giúp đỡ! – taynaron