2010-06-16 19 views
4

系统有一个符号,需要编写一个像(A+B)*C这样的表达式作为#MUL(#ADD(A,B),C)。是否已有一种算法来执行这种符号转换,以便用户可以以更常规的方式输入? 换句话说,一个算法从中缀转换 - >我的符号。第一个问题是我不知道我的记谱法的确切名称......它与逆波兰相似,但不完全相同。每个运算符都被编码为一个带参数的函数。这种符号转换/转换是否存在现有算法?

+2

我认为它被称为“前缀表示法”,因为操作符在操作数列表的开头,而不是在中间(中缀)。 – FrustratedWithFormsDesigner 2010-06-16 15:37:12

+3

这是波兰语,以JanŁukasiewicz命名。它类似于反向波兰符号,只是...反向;) – 2010-06-16 15:38:39

+2

它被称为两者。 – 2010-06-16 15:41:26

回答

9

Shunting-yard algorithm可用于解析中缀表示法。

+0

在10秒内击败我。 – Randy 2010-06-16 15:42:25

+0

+1。我遇到过SY,但它不是完全相同的输出记号,所以我想知道另一个算法是否更接近匹配。这是对现有算法的微小修改吗? – 2010-06-16 16:03:17

+1

调车场可以输出抽象语法树。有了AST,你可以通过预订来获得波兰语。 – 2010-06-16 16:18:36

0

使用Lex和Yacc(Flex和Bison,它们是相同的)很容易解析这些简单的表达式。谷歌为“Yacc计算器”。

我发现的一个例子是http://www.indiastudychannel.com/resources/56696-IMPLEMENTATION-OF-CALCULATOR-USING-YACC.aspx,但不是计算结果,而是应该建立最终的字符串。例如,像这样(伪代码):

expr: ‘(‘expr’)’ 
{ 
$$=$2; 
} 
| 
expr ‘*’expr 
{ 
$$="#MUL(" + S1 + "," + $3 + ")"; 
} 
| 
expr’/’expr 
{ 
$$="#DIV(" + S1 + "," + $3 + ")"; 
} 
+0

一切都很好,但我想把它放在我的代码中,即使它可用,我也不想为一件事添加整个库依赖项。 – 2010-06-16 16:04:44

+0

Lex和Yacc只需要我认为的标准C库。我在我的应用程序中使用它来解析相当复杂的文件,并且运行Lex和Yacc是我构建过程的一部分。就你而言,你可以尝试在本地运行Lex和Yacc,并在你的项目中使用生成的.H和.C文件。毕竟,Lex和Yacc只是处理您的语言描述并生成相当标准的.H和.C文件。这对我认为不应该是你的问题 – Patrick 2010-06-16 16:52:18