这种符号转换/转换是否存在现有算法?
系统有一个符号,需要编写一个像(A+B)*C
这样的表达式作为#MUL(#ADD(A,B),C)
。是否已有一种算法来执行这种符号转换,以便用户可以以更常规的方式输入? 换句话说,一个算法从中缀转换 - >我的符号。第一个问题是我不知道我的记谱法的确切名称......它与逆波兰相似,但不完全相同。每个运算符都被编码为一个带参数的函数。这种符号转换/转换是否存在现有算法?
Shunting-yard algorithm可用于解析中缀表示法。
在10秒内击败我。 – Randy 2010-06-16 15:42:25
+1。我遇到过SY,但它不是完全相同的输出记号,所以我想知道另一个算法是否更接近匹配。这是对现有算法的微小修改吗? – 2010-06-16 16:03:17
调车场可以输出抽象语法树。有了AST,你可以通过预订来获得波兰语。 – 2010-06-16 16:18:36
使用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 + ")";
}
一切都很好,但我想把它放在我的代码中,即使它可用,我也不想为一件事添加整个库依赖项。 – 2010-06-16 16:04:44
Lex和Yacc只需要我认为的标准C库。我在我的应用程序中使用它来解析相当复杂的文件,并且运行Lex和Yacc是我构建过程的一部分。就你而言,你可以尝试在本地运行Lex和Yacc,并在你的项目中使用生成的.H和.C文件。毕竟,Lex和Yacc只是处理您的语言描述并生成相当标准的.H和.C文件。这对我认为不应该是你的问题 – Patrick 2010-06-16 16:52:18
我认为它被称为“前缀表示法”,因为操作符在操作数列表的开头,而不是在中间(中缀)。 – FrustratedWithFormsDesigner 2010-06-16 15:37:12
这是波兰语,以JanŁukasiewicz命名。它类似于反向波兰符号,只是...反向;) – 2010-06-16 15:38:39
它被称为两者。 – 2010-06-16 15:41:26