2008年6月15日
如果使用SQL Server2005的Express版本时,不可避免需要使用SQL Server Management  Express Edition。而2005版本之前的管理器中书写SQL、查找字符、格式化SQL等都觉得不好使。这两天网上看到了两个工具,可以加强SQL Server Management  Express Edition的功能。
1 Red Gate的SQL Prompt。可以看一下blog
www.cnblogs.com/jintan/archive/2008/06/15/1220365.html
2 ssmstoolspack
http://www.ssmstoolspack.com/
It contains a few upgrades to the IDE that I thought were missing from the Management Studio:

在Vista安装时可能出现:外接程序“SQL Server Management Studio Express Tools Pack”未能加载或导致了异常。错误号: 80040154。
解决:使用setup.exe安装,所有用户环境下使用。

posted @ 2008-06-15 16:21 快乐学习 阅读(29) | 评论 (0)编辑
  2008年3月31日

使用AntlrWorks编写了以下Expr.g语法文件,考虑到便与后期遍历树构造节点方便,添加了一些虚Token,例如BINARY。
 语法文件内容如下:

  1 grammar Expr;
  2 
  3 options {
  4   output=AST;
  5   ASTLabelType=CommonTree;
  6  // language=CSharp;
  7 }
  8 
  9 tokens {
 10       CALL;
 11     INDEX;
 12     BINARY;
 13     UNARY;
 14     CONST;
 15     VAR;
 16     FIELD;
 17 }
 18 
 19 expr 
 20     :    logicalOrExpr
 21     ;
 22 
 23 logicalOrExpr 
 24     :    (logicalAndExpr->logicalAndExpr) (OR b=logicalAndExpr -> ^(BINARY OR $logicalOrExpr $b))*
 25     ;
 26                         
 27 logicalAndExpr 
 28     :    (equalityExpr->equalityExpr) (AND b=equalityExpr -> ^(BINARY AND $logicalAndExpr $b))*  
 29     ;   
 30                          
 31 equalityExpr 
 32     :    (relationalExpr->relationalExpr) ((a=EQUALS|a=NOTEQUALS) b=relationalExpr -> ^(BINARY $a $equalityExpr $b))*
 33     ;
 34     
 35 relationalExpr 
 36     :    (additiveExpr -> additiveExpr) ((a=LT|a=LTEQ|a=GT|a=GTEQ) b=additiveExpr -> ^(BINARY $a $relationalExpr $b))? 
 37     ;
 38   
 39 additiveExpr 
 40     :    (multiplyExpr-> multiplyExpr) ((a=PLUS|a=MINUS) b=multiplyExpr -> ^(BINARY $a $additiveExpr $b))*
 41       ;
 42 
 43 multiplyExpr 
 44       :    (powExpr->powExpr) ((a=MUL|a=DIV|a=MOD) b=powExpr ->^(BINARY $a $multiplyExpr $b))* 
 45        ;
 46    
 47 powExpr 
 48        :    (unaryExpr ->unaryExpr) (POWER b=unaryExpr -> ^(BINARY POWER $powExpr $b))? 
 49        ;   
 50 
 51 unaryExpr 
 52     :      (a=PLUS | a=MINUS | a=NOT) unaryExpr -> ^(UNARY $a unaryExpr)      
 53     |      memberExpr 
 54     ;
 55        
 56 memberExpr 
 57        :    basicExpr^ (memberAccessExpr|indexerExpr)* 
 58        ;
 59 
 60 basicExpr 
 61     :    constant |  varExpr | methodExpr | parenExpr;       
 62        
 63 parenExpr 
 64        :    LPAREN expr  RPAREN -> expr
 65        ; 
 66        
 67 constant  
 68       :      (a=INTEGER_LITERAL | a=DECIMAL_LITERAL | a=DATETIME_LITERAL | a=STRING_LITERAL | a=BOOL_LITERAL) -> ^(CONST $a)
 69        ;    
 70        
 71 memberAccessExpr 
 72     :    '.'! memberFunctionExpr
 73     ;
 74 
 75 memberFunctionExpr 
 76     :    fieldPropertyExpr -> ^(FIELD fieldPropertyExpr) | methodExpr
 77     ;
 78     
 79 fieldPropertyExpr 
 80     :    IDENTIFIER
 81     ;    
 82     
 83 varExpr    
 84     :    IDENTIFIER -> ^(VAR IDENTIFIER)
 85     ;
 86 methodExpr    
 87     :    IDENTIFIER LPAREN (argument (COMMA argument)*)? RPAREN -> ^(CALL IDENTIFIER argument*)
 88     ;
 89         
 90 indexerExpr 
 91     :    LBRACKET argument (COMMA argument)* RBRACKET -> ^(INDEX argument+)
 92     ;
 93     
 94 argument 
 95       :     expr 
 96       ;   
 97 
 98    
 99 AND    
100     :    'and'
101     ;
102     
103 OR    
104     :     'or'
105     ;
106 
107 NOT    
108     :     'not'
109     ;
110 
111 COMMA     
112     :     ','  
113     ;
114 
115 PLUS    
116     :     '+'  
117     ;
118     
119 MINUS    
120     :     '-'
121     ;
122     
123 MUL    
124     :     '*'  
125     ;
126     
127 DIV    
128     :     '/'  
129     ;
130     
131 MOD    
132     :     '%'
133     ;
134     
135 POWER    
136     :     '^'
137     ;
138     
139 EQUALS    :    '=';
140     
141 NOTEQUALS 
142     :    '!=' | '<>';
143     
144 LT    :    '<';
145 LTEQ    :    '<=';
146 GT    :    '>';
147 GTEQ    :    '>=';
148 
149 LPAREN
150     :    '('
151     ;
152     
153 RPAREN    :    ')'
154     ;
155 
156 LBRACKET
157     :    '['
158     ;
159 
160 RBRACKET
161     :    ']'
162     ;
163     
164 DATETIME_LITERAL
165     :     '\'' STRING_LITERAL '\''
166     ;
167 
168 STRING_LITERAL    
169     :    '"' (~'"')* '"'    
170     ;
171 
172 BOOL_LITERAL
173     :    'true'|'True'|'false'|'False'
174     ;
175 
176 IDENTIFIER
177     :    LETTER (LETTER|Digit)*
178     ;
179     
180 fragment
181 LETTER    
182     :    'A'..'Z'|'a'..'z'|'_'
183     ;
184 
185 DECIMAL_LITERAL
186     :       (INTEGER_LITERAL)? '.' Digit* Exponent? 
187     ;
188 
189 fragment
190 Exponent 
191     :     ('e'|'E') INTEGER_LITERAL
192     ;
193 
194 INTEGER_LITERAL 
195     :     Digit+ 
196     ;    
197 
198 fragment
199 Digit    
200     :    '0'..'9'
201     ;
202 
203         
204 
205 /* Ignore white spaces */    
206 WS    
207     :  (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
208     ;
209 

在AntlrWorks调试以下语句:2-3+IIF(true=false, ds.b[1].id+bb, pp())
解析后的AST为:
AST.jpg


posted @ 2008-03-31 22:35 快乐学习 阅读(46) | 评论 (0)编辑
  2008年3月29日
当使用AntlrWorks编写完语法文件后进行调试,但是总不成功,说什么端口49153已被占用。使用netstat -an | findstr 49153,发现存在这个端口正在监听,一下子不知道是什么原因导致的。
后来网上查找发现可以在Preferences的Debugger设置缺省端口,于是在那里更改默认端口为49253,再次调试,系统弹出系统防火墙提示窗体。这时才明白原来是当时防火墙的原因,只要设置不阻止这个端口就行了
posted @ 2008-03-29 22:46 快乐学习 阅读(53) | 评论 (0)编辑

AntlrWorks是编写和调试Antlr很好的工具。从网站下载了最新的版本后,发现菜单中执行【打开】,但是没有任何反应。在公司使用时是没有任何问题的,所以一开始还怀疑是不是由于家里是Vista操作系统的原因。
我在公司的机器中安装的JDK打开了自动更新,家里的没有自动更新,所以我又想是不是JDK的版本不对。于是上网下载了一个最新的JDK6,安装后问题就解决了,原来是需要比较新的JDK的支持。

posted @ 2008-03-29 11:59 快乐学习 阅读(41) | 评论 (0)编辑
  2008年3月28日

使用过很多公司的报表试用版本,个人觉得润乾报表 是一个非常灵活的产品,虽然目前的设计器还只能适用于开发人员:)

在试用润乾报表过程中,认真揣摩她的核心概念,发现自己也可以实现一个类似的报表引擎,所以自己也使用Delphi实现了一个显示报表的核心部分的报表引擎(还未添加填报功能),可以看看我以前写的《交叉表的报表设计》示例

实现报表引擎需要使用用到以下两个个核心技术和概念:

  • 数学表达式引擎
  • 报表扩展模型

准备重新实现一个.Net下的报表引擎,可以基于它之上进行表单设计、查询窗体、报表、处理数据分析

就像以上说的需要基于两个核心技术,所以会先实现一个表达式引擎。我在以前的文章Antlr实现表达式引擎的语法文件中写了使用Antlr实现的一个示例的主要语法文件。后期我会使用Antlr编写一个数学表达式计算引擎,到时会和大家分享。

网上还有其他可以参考的文章和资料,大家可以参考。例如:

posted @ 2008-03-28 21:44 快乐学习 阅读(147) | 评论 (5)编辑
  2007年12月3日
下载了VS2005的DSL包,安装后运行例子时报出错误:Can't start preprocessor
搜索后发现必须安装C++后才能正常运行。
posted @ 2007-12-03 22:49 快乐学习 阅读(76) | 评论 (0)编辑
  2007年10月13日

公司使用TD8,装了Kugoo后发现登陆,访问TD时出现 Microsoft Internet Explorer : 4.0 (compatible; MSIE 6.0) is not supported! 
在注册表查找注册表Kugoo,发现有好几项 C:\WINDOWS\system32\KuGoo3DownXControl.ocx ,怀疑是此COM组件导致,于是关闭Kugoo后执行:

regsvr32 /u C:\WINDOWS\system32\KuGoo3DownXControl.ocx

执行完后重启启动IE后就可以顺利访问TD了
posted @ 2007-10-13 15:10 快乐学习 阅读(173) | 评论 (3)编辑
  2007年7月7日
  1. 隐式类型的声明
    var i = 1; // int 
    var a = new int[] { 1, 2, 3, 4, 5 }; // int[] 
  2. 自动属性(Automatic Properties)
     public class Cell {
            //行属性
            public string Row { get; set; }  
            public string Col { get; set; }        
        }
  3. 对象初始化器 
     var cell = new Cell

    Row = 1,  
    Col = 1
    };
  4. 集合初始化器
    var intList = new List { 1, 2, 3, 4, 5 }; 
  5. 匿名类型
     var a = new { Row = 1, Col=1};
  6. 扩展方法
    static class TestExtensions
    {
    public static void AsString(this Cell cell)
    {
    return cell.Row.ToString()+cell.Col.ToString();


 

posted @ 2007-07-07 14:26 快乐学习 阅读(55) | 评论 (0)编辑
  2007年6月28日

在《使用Antlr实现表达式引擎 》中写了主要的类,实现表达式的语法定义文件如下(使用的Antlr为3.0发布版本):

  1grammar XExpression;
  2
  3options {
  4    language=CSharp;
  5    superClass=XExpressionBaseParser;
  6}
  7
  8@header {
  9using XSoft.XExpression;
 10}
 11
 12@members {
 13    public XExpressionParser()
 14        : base(null)
 15    {
 16    }
 17    
 18    public override void Compile()
 19    {
 20        TokenStream = new CommonTokenStream(new XExpressionLexer(new ANTLRStringStream(Expression))); 
 21        ResultNode = xExpression();
 22    }
 23}
 24
 25xExpression returns[ExprNode value]
 26  : a= logicalOrExpression {$value=a;};
 27
 28logicalOrExpression returns[ExprNode value]
 29  : a=logicalAndExpression {$value=a;}
 30    (f=OR b=logicalAndExpression  {GetNestedResultNode(ref $value, f, b);} )* ;
 31                        
 32logicalAndExpression returns[ExprNode value]
 33  : a=relationalExpression {$value=a;}
 34    (f=AND b=relationalExpression  {GetNestedResultNode(ref $value, f, b);} )* ;                        
 35
 36relationalExpression returns[ExprNode value]
 37    :  a=additiveExpression {$value=a;}
 38     ((f=EQUAL |  f=NOT_EQUAL  | f=LESS_THAN |  f=LESS_THAN_OR_EQUAL | f=GREATER_THAN | f=GREATER_THAN_OR_EQUAL)  b=additiveExpression {GetNestedResultNode(ref $value, f, b);}  )?
 39    ;
 40  
 41additiveExpression returns[ExprNode value]
 42  :    a=multiplyExpression {$value=a;}
 43  ((f=PLUS|f=MINUS) b=multiplyExpression {GetNestedResultNode(ref $value, f, b);}  )* 
 44  ;
 45
 46
 47multiplyExpression returns[ExprNode value]
 48  : a=powExpr {$value=a;}
 49   ((f=STAR| f=DIV | f=MOD) b=powExpr {GetNestedResultNode(ref $value, f, b);}  )* ;
 50   
 51powExpr  returns[ExprNode value]
 52   : a=unaryExpression  {$value=a;}
 53   (f=POWER b=unaryExpression {GetNestedResultNode(ref $value, f, b);}  )? ;   
 54
 55unaryExpression returns[ExprNode value]
 56    :  (f=PLUS | f=MINUS | f=NOT) b=unaryExpression    {GetNestedResultNodeArgsNotIncludeValue(ref $value, f, b);}   
 57    |  a=primaryExpression {$value=a;}
 58    ;
 59       
 60primaryExpression returns[ExprNode value]
 61   : (a=parenExpr|a=literal | a=function)  {$value=a;};
 62
 63parenExpr returns[ExprNode value]
 64   :    LPAREN a=xExpression RPAREN {$value=a;}; 
 65    
 66literal returns[ExprNode value]
 67  : (a=numbericLiteral| a= stringLiteral | a=datetimeLiteral)  {$value=a;};   
 68
 69function returns[ExprNode value]
 70@init { ArrayList list_arg = new ArrayList(); }
 71  :    f=IDENTIFIER LPAREN (arg=argument {list_arg.Add(arg);} (COMMA arg=argument { list_arg.Add(arg); }  )*)? RPAREN
 72  { $value = GetNestedResultNode(f, list_arg); }
 73  ;
 74
 75argument returns[ExprNode value]
 76  : a=xExpression  {$value=a;};   
 77
 78numbericLiteral returns[ExprNode value]
 79  :  a=INTEGER_LITERAL {$value = new ConstNode(new IntegerExprData(Convert.ToInt32(a.Text)));}    
 80   | a=DECIMAL_LITERAL {$value = new ConstNode(new DecimalExprData(Convert.ToDecimal(Convert.ToDouble(a.Text)))); }
 81   ;
 82   
 83datetimeLiteral returns[ExprNode value]
 84  :  a=DATETIME_LITERAL 
 85  {$value = new ConstNode(new DateTimeExprData(DateTime.Parse(a.Text.Substring(1, a.Text.Length - 2))));}    
 86  
 87  ;
 88   
 89stringLiteral returns[ExprNode value]
 90  :  a=STRING_LITERAL  
 91    {$value = new ConstNode(new StringExprData(a.Text.Substring(1, a.Text.Length - 2)));}    
 92  ;
 93   
 94AND: 'and';
 95OR: 'or';
 96
 97NOT: 'not';
 98
 99COMMA : ','  ;
100
101PLUS: '+'  ;
102MINUS: '-'  ;
103DIV: '/'  ;
104STAR: '*'  ;
105MOD: '%' ;
106POWER: '^' ;
107
108EQUAL: '=';
109NOT_EQUAL: '<>'  ;
110LESS_THAN: '<'  ;
111LESS_THAN_OR_EQUAL: '<='  ;
112GREATER_THAN: '>'  ;
113GREATER_THAN_OR_EQUAL: '>=;
114
115LPAREN:    '(';
116RPAREN:    ')';
117
118DATETIME_LITERAL: '\'' Digit Digit Digit Digit '-' Digit (Digit)? '-' Digit (Digit)?  '\'';
119
120STRING_LITERAL    : '"'(~'"')* '"' ;
121
122IDENTIFIER:    LETTER (LETTER|Digit)*    ;
123    
124fragment
125LETTER    :    'A'..'Z'|'a'..'z'|'_';
126
127DECIMAL_LITERAL:   (INTEGER_LITERAL)? '.' Digit* Exponent? ;    
128fragment
129Exponent : ('e'|'E') INTEGER_LITERAL;
130
131INTEGER_LITERAL : Digit+ ;    
132
133fragment
134Digit    :'0'..'9';
135
136fragment
137SIGN    :    '+' | '-';
138
139WS  :   (' '|'\t')+ { $channel=HIDDEN; } ;
140




 

posted @ 2007-06-28 22:32 快乐学习 阅读(200) | 评论 (0)编辑
  2007年6月26日
最近想开始利用业余时间编写一些东西, 暂定项目代号:Cheetah(猎豹), 座右铭是:快速、快乐。
初步总体思想是在微软平台下利用开源产品构建快速的C/S企业管理开发平台,第一阶段以报表引擎为核心,构建报表、简单查询、表单,后期逐步加入基于用例的开发、业务规则、业务流程、多维分析等功能。
初步采用技术为C#,使用技术可能涉及Antlr、.Net3/3.5、AOP、CAB、IronPython等。
时间估计会比较长,慢慢来吧:)
posted @ 2007-06-26 22:26 快乐学习 阅读(62) | 评论 (0)编辑