Godot 引擎将字符串计算为 PEMDAS

问题描述

我一直在尝试在 GDScript 中创建一个函数来使用 PEMDAS 规则处理和计算字符串。下面是我对这个主题的尝试。它目前只能使用 MDAS 规则:

有没有更好的方法来实现这样的功能

func _ready() -> void:
    ### USE CASES ###
    print(Compute_String("1+2*3+3="))    # Output = 10
    print(Compute_String("1+2*3*3="))    # Output = 19
    print(Compute_String("1*2*3+3="))    # Output = 9
    print(Compute_String("1+2+3*3="))    # Output = 12
    print(Compute_String("5*2+7-3/2="))  # Output = 15.5
    print(Compute_String("9+5.5*2.25=")) # Output = 21.375
    print(Compute_String("5*2+7-3/2"))   # Output = 1.#QNAN (Missing equals)
    print(Compute_String("5*2+7-/2="))   # Output = 1.#QNAN (Adjacent operators)
    print(Compute_String("*2+7-3/2="))   # Output = 1.#QNAN (Begins with operator)
    print(Compute_String(""))            # Output = 1.#QNAN (Empty)
    print(Compute_String("="))           # Output = 1.#QNAN (Considered as empty)
    print(Compute_String("1 +2="))       # Output = 1.#QNAN (Contains space)
    print(Compute_String("(1+2)*3="))    # Output = 1.#QNAN (Parentheses not supported)

func Compute_String(_string: String) -> float:
    var _result: float = NAN
    var _elements: Array = []
    if not _string.empty() and _string[_string.length() - 1] == "=":
        var _current_element: String = ""
        for _count in _string.length():
            if _string[_count].is_valid_float() or _string[_count] == ".": _current_element += _string[_count]
            else:
                if _string[_count - 1].is_valid_float() and (_string[_count + 1].is_valid_float() if _string[_count] != "=" else true):
                    _elements.append_array([_current_element,_string[_count]]) ; _current_element = ""
                else: return NAN
        if not _elements.empty():
            _elements.resize(_elements.size() - 1)
            while _get_operators_count(_elements) != 0:
                var _id: Array = [0,0.0,0.0]
                if "*" in _elements:
                    _id = _add_adjacent(_elements,"*") ; _remove_adjacent(_elements,_id[0]) ; _elements.insert(_id[0] - 1,_id[1] * _id[2])
                elif "/" in _elements:
                    _id = _add_adjacent(_elements,"/") ; _remove_adjacent(_elements,_id[1] / _id[2])
                elif "+" in _elements:
                    _id = _add_adjacent(_elements,"+") ; _remove_adjacent(_elements,_id[1] + _id[2])
                elif "-" in _elements:
                    _id = _add_adjacent(_elements,"-") ; _remove_adjacent(_elements,_id[1] - _id[2])
                else: return NAN
            if _elements.size() == 1: _result = _elements[0]
    return _result

func _get_operators_count(_elements: Array) -> int:
    var _result: int = 0 ; for _element in _elements: if not str(_element).is_valid_float(): _result += 1 ; return _result

func _add_adjacent(_elements: Array,_operator) -> Array:
    return [_elements.find(_operator),float(_elements[_elements.find(_operator) - 1]),float(_elements[_elements.find(_operator) + 1])]

func _remove_adjacent(_elements: Array,_operator_idx: int) -> void:
    _elements.remove(_operator_idx + 1) ; _elements.remove(_operator_idx) ; _elements.remove(_operator_idx - 1)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)