程序让生活更美好

半亩方塘 天光云影

  C++博客 ::  :: 新随笔 :: 联系 ::  :: 管理 ::
  55 随笔 :: 4 文章 :: 202 评论 :: 0 Trackbacks

Lex和Yacc真不错

这两天一直在忙着写论文,论文中需要用到Lex和Yacc的一些东西,看了一些相关的资料,发现Lex和Yacc两个工具还真是非常有意思的东西,有了它们做一些此法语法方面的东西还真是不错,可以用来帮助设计编译器了。等忙玩这一阵子之后,如果有空再上来写一点相关的东西。

posted on 2007-04-13 21:47 北风之神007 阅读(5933) 评论(3)  编辑 收藏 引用 所属分类: Other

评论

# re: Lex和Yacc真不错 2007-06-14 01:40 fny
我正在编写一个语法分析器。目的是把像a[]c[f[]n[]]这样的数据变换成[‘TREE',[],a] ['TREE',[ ['TREE",[],f] ['TREE',[],n] ], c]这样的数据。也就是任意个树形数据结构的形式变换。目前对于只有嵌套的数据可以成功的变换,既a[], a[b[c[]]]这样的数据。可是对于并列的数据却无法变换,即a[]b[], a[b[]c[]]这样的数据。请教,有没有好的主意?  回复  更多评论
  

# re: Lex和Yacc真不错 2008-03-14 17:34 暗金装备
难度还可以,呵呵,编译原理的时候学过,用栈可以实现此功能:
第一次要先判断整个表达的正确性,
在此基础上开始进行转换:
如a[b[]c[]]:
读入字符,压入栈,直到遇到 [(也压入栈),这时开始构造:['TREE', [
再次读入,压入栈,当遇到 ](不压入栈),弹出栈顶,如果是 ],则构造成: 
['TREE', [], 再次弹出栈顶,直到栈顶是[或者栈空,构造成['TREE', [],b]

以此类推即可,权当参考  回复  更多评论
  

# re: Lex和Yacc真不错 2008-03-14 17:59 暗金装备
#include <iostream>
#include <cstdlib>
#include <stack>

/**
* Application entry
*/
int main(int argc, char *argv[]) {
std::string str = "a[]b[c[f[]]d[]]";
std::string result; // 保存结果
std::stack<char> stack;

stack.push('$'); // 开始的标志,可用可不用
size_t index = 0;
size_t length = str.size();
for (index = 0; index < length; ++index) {
// 如果不是],则压入栈中
if (str.at(index) != ']') {
stack.push(str.at(index));

if ('[' == str.at(index)) {
result += "['TREE', ["; // 树结构的前半部分
}
} else { // 是],说明一个树或者一个子树已经结束,那么构造完这棵树
if ('$' == stack.top()) {
break;
}

// 处理[时的构造结构
if ('[' == stack.top()) {
result += "], ";
stack.pop();
}

// 片面是处理树的名字,在这里用了最简单的处理,只处理了一个字母的
// 其实名字应该是可以有多个字母,这时,用一个循环来解决,而且要注意
// 的是压入栈的,所以读出来的时候名字是反的,所以再反过来就好了.
result.append(1, stack.top());
result += "]";
stack.pop();
}
}

std::cout << result << std::endl;

return EXIT_SUCCESS;
}

输出结果:
['TREE', [], a]['TREE', [['TREE', [['TREE', [], f]], c]['TREE', [], d]], b]  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理