- 论坛徽章:
- 0
|
原帖由 zszyj 于 2008-2-16 11:04 发表 ![]()
呵呵, 自已编码分析表达式并构建语法树并完成测试,即使精通编译原理的高手恐怕也得一周时间吧,更别说LZ是否有能力完成这个任务了.
而四则运算的等价语法模式也不过10来种,只需要几分钟时间, 有现成的语法分析辅助工具而不用? 呵呵,LZ自已看着办就是了.
另外, 补充更正一点, 我列出的语法模式, 考虑到expr是递归语法定义, 因此应该把第一行的statememt改为expr, 即表达式之间的四则运算也是表达式,同样存在需要去掉括号的操作.
原帖由 zszyj 于 2008-2-16 11:24 发表 ![]()
再细想一下, 如果某个节点的子树的树根对应的算符优先级比该节点低,则添置括号,只通过父结点优先级高于子结点则加括号是不完整的,同样存在我前面据说的穷举所有加括号的语法模式问题. 例如以下几个模式父子结点优先级相同,但却要加括号:
父结点是'/'而子结点是"*", 则要加括号, 证明: a/(b*c) != a/b*c;
父结点是'-'而子结点是'+', 也要加括号,证明:a-(b+c) != a-b+c;
....
这样, 与我用语法模式表达的穷举有什么两样? 不过是用大量的if判断代替了语法模式来穷举而已.
我什么时候说要手动分析了,设计好文法,用yacc不就行了?
还有,你说的“Wind-Son所说的先去括号,然后根据父子结点之间的算符优先级的方法是欠考虑的”,我原话更正一下:
“如果某个节点的子树的树根对应的算符优先级比该节点低或相等,则添置括号”
形式化的递归文法一般都是可以避免穷举的 |
|