标记化数学表达式-如何知道使用了多少个隐式乘法?

我有一个有趣的问题。我正在开发将标记数学表达式的程序,如以下示例所示:

'(3+4)*sin(45)'-> ['(','3','+','4',')','*','sin','(','45',')']

其右侧是一个堆栈,每个元素都是一个Token结构,我在标记化时将其添加到其中。要malloc()用于堆栈的空间,请执行以下操作:

stack_ptr = malloc(strlen(input_expression) * sizeof(struct Token))

我这样做的前提是,如果表达式为3*4*5,那么每个字符都是一个标记。因此,我认为一个表达式不可能拥有比字符更多的标记。 但是,看来我错了。

我最近添加了检测隐式乘法速记的功能。我通过跟踪迭代中的当前令牌和过去令牌来做到这一点。如果当前标记是函数或左括号,而先前的标记是右括号或数字,则在添加当前标记之前,我先添加一个乘数标记。一个示例如下:

'3sin(45)'-> ['3',')']4(3+1)-> ['4','1'])

我确定你知道图片。无论如何,正如您可能期望的那样,添加新令牌会引起问题。主要...嗯,看一下URL栏。

我猜我的选择如下:

  1. 为堆栈“ insurance room”选择任意乘数,例如malloc(strlen(input_expression) * 2 * sizeof(struct Token))
  2. 实施一些真正令人讨厌的正则表达式解决方案,以检测隐式乘法并计算其出现次数
  3. 禁用隐式乘法

或者,我问的原因是:有什么更好的方法吗?另外,如果这些是我唯一的解决方案,由于希望保持隐式乘法,并且由于即使在使用“现代” pcre2库时,我也发现正则表达式使用该语言非常烦人,因此我很可能选择#1。因此,我也很想知道:#1被认为是“不良做法”吗?

akongyiji000 回答:标记化数学表达式-如何知道使用了多少个隐式乘法?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2937552.html

大家都在问