- 论坛徽章:
- 0
|
原帖由 Wind-Son 于 2008-2-17 14:03 发表 ![]()
我没有说一定要生成语法树,也没有说一定要用YACC,就是给楼主个选择和提示而已嘛。
对非线性结构的分析本质上就是语法分析,但是否生成语法树就看情况。一般,如果一遍遍历可以完成所有操作,则不必真 ...
多重括号很好解决,只要增加一个不作输出的递归替代模式就行,如下:
expr:
'(' '(' expr ')' ')' : yytext = '(' expr ')';
.... // 其它部分照抄前面;
而我之所以举上一个贴子的例子a-b-c, 是因为它确实是有问题的,因为并不一定是'-'和'/'就必须对右结点加括号. 即使按照你的说法, 右子结点只有一个 'c', 那么按照你的判断语句,生成的就是a-b-(c),一样是有问题,这不是LZ所要的.
因此, 我的意见仍然是,不管你是否生成了语法树, 用的是加括号法还是减括号法, 都无法用一两个简单判断规则就完成, 仍然是需要总结数学表达式的结构, 并转换成相应的判断规则语法(不管是用if, 还是用yacc里面的patten,都是一样的).
不过,这都不重要了,现在原题的答案已经很明了, 不管谁喜欢用什么办法,都不难,只要自已熟悉就行.
我现在比较感兴趣的是, 如何将YACC自已解析语法过程中使用的语法树直接完整生成出来, 因为我觉得这个功能确实很有用, 我在使用yacc过程中,从来是YACC调用我的代码,而我无法调用它的代码,例如你说的mknod. 所以还是请你再辛苦一下,举个简单例子, 让我们学习一样怎么使用这个功能, 不一定是YACC,bison也行. 请不吝赐教.
[ 本帖最后由 zszyj 于 2008-2-17 22:15 编辑 ] |
|