如何验证数学表达式?

时间:2018-03-25 23:33:41

标签: c calculator postfix-notation infix-notation

我正在编写一个科学计算器,目前正处于对中缀字符串进行标记的阶段。我还实现了一个有效的Dijkstra方法(我认为这也称为Shunting-Yard算法)。但是目前,我无法验证输入字符串,这当然是我在开始评估表达式之前需要解决的问题。

在我看来,我目前有三个选项可以在什么阶段验证表达式:

  • 在我对其进行标记时验证中缀字符串;
  • 在转换为反向波兰表示法时验证中缀令牌列表(使用Dijkstra的方法/ S.Y。算法);
  • 转换后验证反向波兰语令牌列表(我相信Dijkstra的方法无论如何都会遇到一些错误)。

理论上,我甚至可以在对其进行标记之前对原始输入字符串进行验证,但这看起来很愚蠢,但如果情况好一点,我就不会将其排除在外。

我已经在一些地方进行了研究,并且已经收集了一个粗略的想法,但我目前无法将其转换为实现(对于格式不一致的道歉,我15岁之前因此我已经有几年了体验美丽的引文格式世界):

所以我目前的情况是我有可以标记的字符串,然后转换为反向波兰表示法。我应该在前面提到的过程中的哪一点验证输入字符串,我该如何解决?

感谢。

顺便说一句;如果它是相关的,我将字符串标记为以下结构的列表token_t

typedef long double num_t;

typedef enum {
    EXP = 0,
    DIV = 1,
    MUL = 2,
    ADD = 3,
    SUB = 4,
    U_MIN = 5 // unary minus
} operator_t;

typedef enum {
    ROOT = 0,
    ABS = 1,
    SIN = 2,
    COS = 3,
    TAN = 4,
    SEC = 5,
    CSC = 6,
    LOG = 7
} function_t;

typedef enum {
    BRACKET_OPEN = 0,
    BRACKET_CLOSE = 1
} bracket_t;

typedef enum {
    OPERATOR = 0,
    FUNCTION = 1,
    BRACKET = 2,
    NUMBER = 3
} token_type_t;

typedef struct {
    token_type_t type;

    union {
        operator_t op;
        function_t func;
        num_t num;
        bracket_t br;
    };
} token_t;

可以在GitHub repo上找到处于正在进行状态的整个项目。

0 个答案:

没有答案