书看了大半,天马行空似懂非懂。返回头看看感觉没学到什么东西,所以还是动手尝试下。实际这个解析器只是sqlite语法的一个create table语法,而且也没完全实现(不支持check约束和指定数据库)。
为了定一个模子我先写了一个create table 的antlr文法(如下)照着做的。
grammar sqlitcreatetable; @members{ private boolean isType(String id){ id=id.toLowerCase(); return id.equals("int")|| id.equals("integer") ||id.equals("bool")||id.equals("boolean") ||id.equals("long") ||id.equals("short")||id.equals("byte") ||id.equals("float") ||id.equals("real")||id.equals("double") ||id.equals("blob") ||id.equals("text")||id.equals("varchar")||id.equals("nvarchar")||id.equals("string")||id.equals("char"); } } createTableStatment : 'create' (temp='temp'|temp='temporary')? 'table' ('if' 'not' 'exists')? name columnList ';'? { System.out.print(($temp.text!=null? "temporary ":"") + "table:"+$name.text); } ; columnList : '(' column (',' column)* ')' ; column : name type typelimit? constainst* { System.out.println("column:" +$name.text +" "+$type.text); } ; typelimit : '(' a=INT ( ',' b=INT)? ')' { if($a.text!=null && $b.text!=null){ System.out.print("(" +$a.text+ ","+$b.text+")"); }else if($a.text!=null ){ System.out.print("(" +$a.text+")"); } } ; type : { isType( input.LT(1).getText() ) }?ID ; constainst : 'primary' 'key' {System.out.print(" primary key"); } | 'unique' {System.out.print(" unique"); } | 'default' '(' (v=INT|v=FLOAT|v=STRING) ')' {System.out.print(" default("+$v.text+")"); } | 'not' 'null' {System.out.print(" not null"); } | 'autoincrement' {System.out.print(" autoincrement"); } ; name : '[' ID ']' | ID ; ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ; INT : '0'..'9'+ ; FLOAT : ('0'..'9')+ '.' ('0'..'9')* EXPONENT? | '.' ('0'..'9')+ EXPONENT? | ('0'..'9')+ EXPONENT ; COMMENT : '--' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} | '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;} ; STRING : '\'' ( ESC_SEQ | ~('\\'|'\'') )* '\'' ; fragment EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; fragment HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; fragment ESC_SEQ : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') | UNICODE_ESC | OCTAL_ESC ; fragment OCTAL_ESC : '\\' ('0'..'3') ('0'..'7') ('0'..'7') | '\\' ('0'..'7') ('0'..'7') | '\\' ('0'..'7') ; fragment UNICODE_ESC : '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT ; WS : ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;} ;
生成这个文法的代码调试输入create table 语句则会输出表、列、列类型和约束信息。
sqlite的create table 语法还是比较简单的,用LL(1)即可以实现了。比较麻烦的还是词法分析部分,由于 Terence Parr讲解的例子里面未涉及到关键字的识别,所以对于关键字的识别我采用了向前看(n+1)来判断是否为某关键字。这个算法(isKW函数)或许是错误的方法请各位有经验的朋友指教。
代码没神码好贴的了有兴趣的朋友下载代码编译跑跑。看看输入内容
" create temporary table\n/*MLComment*/ IF NOT EXISTS [table_name] (\n[a1] int unique not null,b1 double(22) primary key,c1 string(1,2) AUTOINCREMENT,e1 float not null,ff char default(0.123) )--SLComment";
在节点的保存上我采用了简单的收集需要的节点,而不是异形树或同型树之类,遍历的结果将输出这样的
MLComment SLComment tbl--temporaray table_name Column--a1 int unique not null Column--b1 double(22) primary key Column--c1 string(1,2) autoincrement Column--e1 float not null Column--ff string default(0.123)
相关推荐
多线程读写sqlite数据库,同步锁,计时测试读写性能,
多进程写sqlite数据库解决互斥的方案,当然代码也顺便处理了多线程写数据库的问题。
一款绿色的SQLite文件查看编辑器,支持SQL语句,直接解压后运行文件夹里面的SQLiteDatabaseBrowserPortable.exe即可运行,打开文件时文件类型选择所有类型,内附简单的使用方法,配合i4等苹果手机助手可以方便得将...
SQLite是文件级别的数据库,其锁也是文件级别的:多个线程可以同时读,但是同时只能有一个线程写。Android提供了SqliteOpenHelper类,加入Java的锁机制以便调用。但在C#中未提供类似功能。 作者利用读写锁...
C从头写一个SQLite数据库引擎
Qt自带了sqlite的驱动,也有各种文件的读写操作,用起来很是方便,这里仅仅是做了一个简单的封装,方便多个数据库和多个文件的操作。
System.Data.SQLite.DLL C# 读写sqlite数据库 亲测可用 不能读取加密的sqlite数据库
本文实例讲述了C#操作SQLite数据库之读写数据库的方法。分享给大家供大家参考,具体如下: 这里演示读写数据库并在窗体(Form)中显示其数据,其方式为: 读: Database(SQLite) -> DataAdapter -> DataSet -> ...
小巧的一个SQLite管理器,用于打开sqlite创建的数据库文件。
SQLite查看器,可以将Android studio或eclipse里面导出来的SQLite数据库文件拖进来查看,一目了然
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。...
最新版SQLite可视化编辑器,能够实现数据库的创建,删除。以及数据表的增删改的可视化编辑。操作非常简单。
一个sqlite读写VC的例子,VC8环境下开发。
sqlite编辑器
sqlite3 xml读写
4 * 这是个非常简单的SQLite的Java程序, 5 * 程序中创建数据库、创建表、然后插入数据, 6 * 最后读出数据显示出来 7 * @author zieckey (http://zieckey.cublog.cn) 8 */ 9 public class TestSQLite{ 10 ...
安卓版 SQLite编辑器(可查看编辑修改手机里面所有的数据库文件)安卓版 SQLite编辑器(可查看编辑修改手机里面所有的数据库文件)安卓版 SQLite编辑器(可查看编辑修改手机里面所有的数据库文件)
sqlite-psi,一个可扩展的sqlite解析环境,输出psi.zip
android数据库sqlite查看器,简单的6M的软件实现数据库查看