0

首先,我知道我知道。这个问题以前曾被问过几次,但大多数关于其他主题的答案只部分回答了我的问题。

我正在做一些可以解析 C 类表达式的事情。这包括表达式,例如(一些示例)

1) struct1.struct2.structarray[283].shd->_var
2) *((*array_dptr)[2][1] + 5)
3) struct1.struct2.struct3.var + b * c / 3 % 5

问题是......我需要快速解决这个问题。尽可能快的,即使它使代码变得丑陋——嗯,很明显,速度的提高必须是有形的。原因是它被解释了。它需要快速...

我有很多问题,我可能会根据您的回答提出更多问题。但无论如何...

首先,我知道“运营商优先级”。例如,在 C 编译器中实现的算法将为运算符分配一个优先级编号并基于该编号评估表达式。我查阅了这张表:http ://en.wikipedia.org/wiki/Operators_in_C_and_C++#Operator_precedence

现在,这很酷,但是......我想知道一些事情。我的主要问题是……您将如何以最快的速度实现这一点?

例如,我考虑过......(请注意我所说的程序实际上解析包含这些表达式的文件,并非所有 C 运算符都将被支持)

1)将表达式字符串存入一个数组,将每个运算符的位置存储在一个数组中,然后从最高优先级的运算符开始解析所有这些废话。例如,如果我有 str = "2*1+3",那么在检查所有存在的运算符后,我将检查 str[1] 处的位置,并检查左右两侧,执行操作(这里是乘法)然后用结果替换表达式并再次评估。

我看到的问题是......说 expr 中的两个运算符具有相同的优先级

例如:var1 * var2 / var3 / var4

由于 * 和 / 具有相同的优先级,如何知道从哪个位置开始解析?当然这个例子是相当直观的,但我可以在巨大的表达式上增长问题。

2)这甚至可以做到非递归吗?通常递归意味着由于多个函数调用设置自己的堆栈帧、重新初始化东西等而变慢。

3)如何区分一元运算符和非一元运算符?

例如:2 + *a + b * c

有解引用操作和乘法操作。直觉上我有一个关于如何做到这一点的想法,但我不确定。我宁愿对此提出您的建议(我认为:检查右侧或左侧成员之一是否是操作员,如果是,那么它是一元的?)

4)我没有得到从右到左评估的表达式。看起来太不自然了。更多的是我不明白这是什么意思。你能举个例子吗?为什么要这样?!!

5)你有更好的算法吗?实现它的更好想法?

就目前而言,这几乎概括了我的想法。顺便说一句,这不是家庭作业。是实用的东西。

谢谢!

4

0 回答 0