我正在编写一个科学计算器,目前正处于对中缀字符串进行标记的阶段。我还实现了一个有效的Dijkstra方法(我认为这也称为Shunting-Yard算法)。但是目前,我无法验证输入字符串,这当然是我在开始评估表达式之前需要解决的问题。
在我看来,我目前有三个选项可以在什么阶段验证表达式:
理论上,我甚至可以在对其进行标记之前对原始输入字符串进行验证,但这看起来很愚蠢,但如果情况好一点,我就不会将其排除在外。
我已经在一些地方进行了研究,并且已经收集了一个粗略的想法,但我目前无法将其转换为实现(对于格式不一致的道歉,我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上找到处于正在进行状态的整个项目。