程序让生活更美好
半亩方塘 天光云影
C++博客
:: ::
新随笔
::
联系
:: ::
管理
::
55 随笔 :: 4 文章 :: 202 评论 :: 0 Trackbacks
公告
本人文章,随便转载
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(11)
给我留言
查看公开留言
查看私人留言
随笔分类
(58)
Boost
(rss)
c/c++(28)
(rss)
Office
(rss)
Other(9)
(rss)
QT(8)
(rss)
STL(1)
(rss)
Templates(1)
(rss)
Tools(3)
(rss)
UNIX(8)
(rss)
文章分类
(4)
SQLite(4)
(rss)
c++
STL中文站
Boost
C/C++ Reference
cplusplus
最新随笔
1. 在windows环境中配置go语言开发环境
2. Qt程序Release模式编译
3. 使用jpeglib库实现bmp转jpg (转)
4. VC6.0下的GDI+配置(转)
5. Linux下QT程序字体设定错误造成程序中文乱码
6. C 代码优化(转)
7. C 高效编程忠告(转)
8. UNIX下编译SQLite3.3.6
9. *.bff文件的安装
10. 重装系统后ORACLE的恢复的几种方法(转载)
11. Solaris环境下编译头文件的注意事项
12. 简单介绍UNIX下编写定时器程序
13. 主流UNIX命令对比表
14. XMananger不能登录AIX的问题分析
15. AIX中的inittab 文件(转)
16. crontab命令详解(转帖)
17. QT Designer中安装QWT插件
18. C实现转动的短棒
19. C语言获取目录中文件名
20. Broadcom NetXtrem II网卡Linux安装指南(转载)
积分与排名
积分 - 269689
排名 - 95
最新随笔
1. 在windows环境中配置go语言开发环境
2. Qt程序Release模式编译
3. 使用jpeglib库实现bmp转jpg (转)
4. VC6.0下的GDI+配置(转)
5. Linux下QT程序字体设定错误造成程序中文乱码
6. C 代码优化(转)
7. C 高效编程忠告(转)
8. UNIX下编译SQLite3.3.6
9. *.bff文件的安装
10. 重装系统后ORACLE的恢复的几种方法(转载)
11. Solaris环境下编译头文件的注意事项
12. 简单介绍UNIX下编写定时器程序
13. 主流UNIX命令对比表
14. XMananger不能登录AIX的问题分析
15. AIX中的inittab 文件(转)
16. crontab命令详解(转帖)
17. QT Designer中安装QWT插件
18. C实现转动的短棒
19. C语言获取目录中文件名
20. Broadcom NetXtrem II网卡Linux安装指南(转载)
最新评论
1. re: 左值和右值
@wu
因为自增和自减运算符是有副作用的
--hj
2. re: UNIX下编译SQLite3.3.6
你好博主,我在aix6.1上编译sqlite遇到了问题,能请教你吗?492217330@qq.com谢谢
--庄
3. re: C++中的内存对齐[未登录]
看过好几个内存对齐了,你的最直观!!!
--燕子
4. re: C++中的内存对齐[未登录]
解释的十分精辟!
--zc
5. re: C++中的内存对齐
@牛在蓝天
补充的很好,谢谢~
--coat white
Lex和Yacc真不错
Lex和Yacc真不错
这两天一直在忙着写论文,论文中需要用到Lex和Yacc的一些东西,看了一些相关的资料,发现Lex和Yacc两个工具还真是非常有意思的东西,有了它们做一些此法语法方面的东西还真是不错,可以用来帮助设计编译器了。等忙玩这一阵子之后,如果有空再上来写一点相关的东西。
posted on 2007-04-13 21:47
北风之神007
阅读(5945)
评论(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]
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
在windows环境中配置go语言开发环境
UNIX下编译SQLite3.3.6
重装系统后ORACLE的恢复的几种方法(转载)
Broadcom NetXtrem II网卡Linux安装指南(转载)
C++各大有名库的介绍(转载)
Lex和Yacc真不错
软件测试的14种类型(转载)
C++Primer第四版下载
《C和指针》书里面的源程序
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 北风之神007