系统有一个符号,需要编写一个像(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
这里是一些Lisp that attempts the infix -> prefix transformation。它可以作为一个有用的起点。
使用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
- 1. python是否有转换运算符?
- 2. 将这两种方法转换为负值是否有区别?
- 3. 这是否符合转换条件?
- 4. 有没有办法将这种字符串转换为日期?
- 5. 将codeSnippet转换为Resharper模板。是否有这种工具?I
- 6. 符号 - 无符号转换
- 7. 将符号从一种位置转换为另一种符号
- 8. std :: vector是否有转换运算符?我在看什么?
- 9. 转换int转换为符号
- 10. 转换之前检查字符串是否有货币符号
- 11. 转换运算符
- 12. Java是否有转换器?
- 13. 转换算法,C#
- 14. 用static_cast实现的转换运算符
- 15. 具有建立者类型转换和转换运算符的转换序列
- 16. 在转换之前是否有干预方式来转换值?
- 17. 是否存在SVG'弯曲'转换
- 18. 转换std_logic_vector,同时保持精度和转换为有符号
- 19. 闪存库符号到Flex转换器
- 20. Java语法 - 转换后的额外加号是否有效?
- 21. Xaml转换保持现有转换不受影响转换
- 22. 无法隐式转换类型双为int,显式转换存在(是否缺少强制转换?)
- 23. 这个Unicode NFC转换是否正确?
- 24. 这个类型转换是否正确?
- 25. 这些endian转换是否正确?
- 26. 打字稿是否将一元否定运算符转换为?
- 27. 有没有办法在MySQL中将这些符号转换为纯文本?
- 28. CSS转换:如何产生这种效果(链接转换)
- 29. 转换运算符快还是不快?
- 30. ( - )符号用于转换方法
我认为它被称为“前缀表示法”,因为操作符在操作数列表的开头,而不是在中间(中缀)。 – FrustratedWithFormsDesigner 2010-06-16 15:37:12
这是波兰语,以JanŁukasiewicz命名。它类似于反向波兰符号,只是...反向;) – 2010-06-16 15:38:39
它被称为两者。 – 2010-06-16 15:41:26