社区
模式及实现
帖子详情
如何用C/C++,将select语句写成一个语法树?求教高人
拥抱_未来
2016-11-24 02:28:07
加精
如题,刚开始参加工作,要做一棵语法树,然后可以将tree作为参数,遍历字符串,有没有会做的帮帮我呀!谢谢了!都快急死我了...
...全文
6297
42
打赏
收藏
如何用C/C++,将select语句写成一个语法树?求教高人
如题,刚开始参加工作,要做一棵语法树,然后可以将tree作为参数,遍历字符串,有没有会做的帮帮我呀!谢谢了!都快急死我了...
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
42 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mLee79
2016-12-29
打赏
举报
回复
SELECT , UPDATE, CREATE TABLE 啊啥的应该大部分没问题, 没检查过, 啥时候把词法分析部分补上
mLee79
2016-12-29
打赏
举报
回复
等几分钟好像就有了.... http://download.csdn.net/detail/mlee79/9724361
mLee79
2016-12-29
打赏
举报
回复
这种东西还是用脚本做比较方便, 用 C 写太累了, 我刚传了个 js 版本到 csdn 咋找不到了, 奇怪, 一会再看看, 语法部分应该差不多把 MySQL 的抄全了, 就是 词法部分缺了很多, mySQL 没用 lex 做词法分析, 懒得慢慢写了...
赵4老师
2016-12-26
打赏
举报
回复
https://www.baidu.com/s?wd=语法树%20遍历输出
Tomly_yang
2016-12-25
打赏
举报
回复
正在自学C++的小白路过!希望各位大牛多多指点
拥抱_未来
2016-12-12
打赏
举报
回复
不是这样的,现在的问题是能生成一颗tree,能实现加减乘除的操作,只能returne 一个int值;但是现在的要求是,传入一个字符串原样输出,而不是计算其结果,比如传一个a = b + c; 生成语法树tree之后,再原样输出出来。不知道怎么搞了。
newnewnewbie
2016-12-11
打赏
举报
回复
嗯不错学习了。。。。。
拥抱_未来
2016-12-07
打赏
举报
回复
有没有人用代码说说的具体怎样实现的,实现起来确实困难,求指教。
谁在煮酒
2016-12-06
打赏
举报
回复
你能生成语法树还不能原样输出。最简单的,生成语法树结点的时候把带有字符串的结点加上id.最后按照先序遍历将带有id的节点存入数组。根据id排序。输出即可。
赵4老师
2016-12-01
打赏
举报
回复
搜“CPP代码 语法树的遍历”
赵4老师
2016-12-01
打赏
举报
回复
搜“CPP代码 树的遍历”
拥抱_未来
2016-11-30
打赏
举报
回复
问题进展到了,如何通过语法树原样输出传入的字符串! 即首先写一个.g的语法文件,根据Java org.antlr.Tool .g 生成语法树tree,然后传入一个字符串,然后手写一个main主程序函数调用tree,再原样输出传入的字符串。 请问何解? 估计我在这么说,大部分人和我一样都蒙圈了,没什么思路。 现在我能生成语法树tree,但是不会写再通过tree原样输出字符串。 有没有玩过语法树的出来说说?谢过!!
qq_36858195
2016-11-29
打赏
举报
回复
恩,不错,学习了~
拥抱_未来
2016-11-29
打赏
举报
回复
grammar StreamSQL; options { language=C; ASTLabelType=pANTLR3_BASE_TREE; output=AST; } tokens { TOK_CREATE_SCHEMA; TOK_CREATE_STREAM; TOK_CREATE_WINDOW; TOK_SELECT; TOK_SCHEMA_LIST; TOK_NAME_TYPE; TOK_SELEXPR; TOK_SELITEM; TOK_SELLIST; } statement : selectStatement EOF | createStatement EOF ; selectStatement : KW_SELECT selectList KW_FROM instreamName=Identifier LSQUARE windowName=Identifier RSQUARE KW_INTO outstreamName=Identifier -> ^(KW_SELECT selectList $instreamName $windowName $outstreamName) ; selectList : selectColumn (COMMA selectColumn)* -> ^(TOK_SELLIST selectColumn+) ; selectColumn : selectItem | selectExpression ; selectItem : Identifier KW_AS Identifier -> ^(TOK_SELITEM Identifier Identifier) ; selectExpression : functionName=Identifier LPAREN itemName=Identifier RPAREN KW_AS asName=Identifier -> ^(TOK_SELEXPR $functionName $itemName $asName) ; createStatement : KW_CREATE KW_SCHEMA Identifier schemaList -> ^(TOK_CREATE_SCHEMA Identifier schemaList) | KW_CREATE streamType KW_STREAM streamName=Identifier schemaName=Identifier -> ^(TOK_CREATE_STREAM streamType $streamName $schemaName) | KW_CREATE KW_WINDOW windowName=Identifier LPAREN KW_SIZE Number KW_ADVANCE Number KW_ON onWhat=Identifier RPAREN -> ^(TOK_CREATE_WINDOW $windowName Number Number $onWhat) ; schemaList : LPAREN columnNameType (COMMA columnNameType)* RPAREN -> ^(TOK_SCHEMA_LIST columnNameType+) ; streamType : (KW_INPUT | KW_OUTPUT) ; columnNameType : coluName=Identifier dataType -> ^(TOK_NAME_TYPE $coluName dataType) ; dataType : KW_INT | KW_DOUBLE ; // Keywords KW_FROM : 'FROM'; KW_AS : 'AS'; KW_SELECT : 'SELECT'; KW_ON : 'ON'; KW_CREATE: 'CREATE'; KW_INT: 'INT'; KW_DOUBLE: 'DOUBLE'; KW_INTO: 'INTO'; KW_SCHEMA: 'SCHEMA'; KW_INPUT: 'INPUT'; KW_OUTPUT: 'OUTPUT'; KW_STREAM: 'STREAM'; KW_WINDOW: 'WINDOW'; KW_SIZE: 'SIZE'; KW_ADVANCE: 'ADVANCE'; // Operators // NOTE: if you add a new function/operator, add it to sysFuncNames so that describe function _FUNC_ will work. DOT : '.'; // generated as a part of Number rule COMMA : ',' ; SEMICOLON : ';' ; LPAREN : '(' ; RPAREN : ')' ; LSQUARE : '[' ; RSQUARE : ']' ; MINUS : '-'; PLUS : '+'; // LITERALS fragment Letter : 'a'..'z' | 'A'..'Z' ; fragment Digit : '0'..'9' ; fragment Exponent : 'e' ( PLUS|MINUS )? (Digit)+ ; fragment Number : (Digit)+ ( DOT (Digit)* (Exponent)? | Exponent)? ; Identifier : (Letter | Digit) (Letter | Digit | '_')* ; WS : (' '|'\r'|'\t'|'\n') {$channel=HIDDEN;} ; 这是StreamSQL.g语法文件;编译方法为 java -jar ../antlr-3.4-complete.jar ./StreamSQL.g # 看一下文件,应该有这些 StreamSQL.g StreamSQLLexer.c StreamSQLLexer.h StreamSQLParser.c StreamSQLParser.h StreamSQL.tokens 但是不知道怎么编写main函数,去调用这棵树tree,来实现传入一个select字符串并解析出来;网上都查遍了就是没有实现方法,有没有懂这方面的牛人,帮忙看看怎么写?先谢谢各位了!谢谢各位关注我的帖子。
赵4老师
2016-11-28
打赏
举报
回复
难道SQLite源代码中没有扫描SQL语句生成对应语法树的功能?
an_bachelor
2016-11-28
打赏
举报
回复
语法树没那么高大上 开源的库也一大把 何况只是规整的sql语句 我敢说不用库我i也能写个八九不离十
Inhibitory
2016-11-28
打赏
举报
回复
可以去看看 SableCC,编译器的编译器,可以根据规则生成语法树
qq_35638081
2016-11-28
打赏
举报
回复
可以咨询我 1437686033
拥抱_未来
2016-11-28
打赏
举报
回复
不好意思,表达有误,我想要的是生成一颗语法树tree,例如select 语句,tree作为参数输入一个str字符串,能够遍历字符串! 上网查阅相关资料,可以用antrlr v3.4 版本生成语法树;只是语法文件不知道怎么写以及如何去实现遍历!
cattpon
2016-11-28
打赏
举报
回复
learning~
加载更多回复(18)
《C语言/
C++
学习指南》语法篇(从入门到精通)
一门初级、从入门到精通的C语言
C++
语法教程,由毕业于清华大学的业内人士执课。从简单的HelloWorld入门程序,到深入的C语言
C++
核心概念,均为您娓娓道来,言之必详、听之必懂。让C语言
C++
编程变得简单,让C语言
C++
编程变得有趣,让喜欢C语言
C++
的人学会C语言
C++
!
如何在Linux下用C/
C++
语言操作数据库sqlite3
http://tech.ddvip.com/2007-10/119338075236567.html0. 引言 我们这篇文章主要讲述了如何在C/
C++
语言中调用 sqlite 的函数接口来实现对数据库的管理, 包括创建数据库、创建表格、插入数据、查询数据、删除数据等...
程序员笔试知识点整理(C/
C++
)
0、常考基础必知必会 A. 排序:排序有几种,各种排序的比较,哪些排序是稳定的,快排的算法;... 链表和数组的区别,在什么情况下用链表什么情况下用数组? D. 栈和队列的区别? E. 多态,举例
题解 | #将两个
SELECT
语句
结合起来(二)#
bo投递,跟面试官和hr沟通了一下,运去哪也是不进行校招,都是进行实习转正,大概明年年初确定转正名额,听面试官说现在有4个,计划再招2个,应该是 6进3 或者。得物24届秋招内推!金九的末尾了,记一下秋招的经历--...
linux c/
c++
GDB教程详解
原文:...GDB是GNU开源组织发布的
一个
强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB
模式及实现
5,530
社区成员
4,169
社区内容
发帖
与我相关
我的任务
模式及实现
C/C++ 模式及实现
复制链接
扫一扫
分享
社区描述
C/C++ 模式及实现
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章