Cavingdeep的.NET专栏

软件开发与工程,又一种艺术。
随笔 - 8, 评论 - 83, 引用 - 5

导航

关于

逆水行舟,不进则退!

业精于勤,荒于嘻
行成于思,毁于随



月 [下月] [上月]


标签

每月存档

最新留言

  • 回复: 使用Subversion做.NET项目
    项目中单独的文件权限好像不能控制吧, 不知道可以控制目录不?
    by Daniel(匿名) on 2007/7/24 20:54:00
  • re: 使用Subversion做.NET项目
    请问怎样控制一个repository中不同文件的权限?
    by xmpp(匿名) on 2006/9/9 23:53:00
  • DotNet 网上资源
    相关网站列表http://blog.joycode.com/博客堂主要是微软专家的帖子,内容较新http://www.cnblogs.com/博客园 http://www.microsoft....
    by ldz(匿名) on 2006/8/23 15:34:00
  • re: 使用Subversion做.NET项目
    单位只允许80端口,而同一个服务器上有两个web服务器IIS and Apache。IIS跑asp.net & asp ,Apache 跑svn。怎么解决这个端口问题啊?
    by Daniel(匿名) on 2006/8/21 19:01:00
  • DotNet 网上相关资源
    <br>DotNet 网上相关资源 <br> <br>相关网站列表 http://blog.joycode.com/ 博客堂 主要是微软专家的帖子,内容较新 ht...
    by Killkill's Blog(匿名) on 2006/5/5 14:33:00
  • DotNet资源
    DotNet相关网站列表
    by OX(匿名) on 2006/4/29 14:03:00
  • re: 又一个语言识别工具(ANTLR)
    今后不用再想写编译器了我……
    by S.F.(匿名) on 2005/4/22 20:10:00
  • re: 用DCG做单元测试报表
    呵呵,你的DCG又想到新的应用了:)
    by Laser.NET(匿名) on 2005/4/19 19:53:00
  • re: DCG添加简单调试功能并开源
    多谢sa指点!^_^
    by Cavingdeep(匿名) on 2005/4/18 8:16:00
  • re: DCG添加简单调试功能并开源
    文件压缩格式最好用zip,因为rar格式是商业格式,再opensource时要注意这点:)
    by sa(匿名) on 2005/4/17 10:28:00
  • re: AOP在.NET中的现实
    to 衰人, <br> <br>代理模式的用意之一就是要能够替代(代理)一个对象,那么如果不从这个对象继承下来,如何代理它呢?我明白你说的意思,你说的是以实现一个行为接口,通过...
    by Cavingdeep(匿名) on 2005/4/16 16:17:00
  • re: 又一个语言识别工具(ANTLR)
    等我学会了西班牙语后,我都火化了!...
    by csharphack(匿名) on 2005/4/15 18:23:00
  • re: 又一个语言识别工具(ANTLR)
    呵呵,还是懂多国语言的好啊~~牛!! <br>西班牙语我就别指望了:)呵呵,还是以后要用的时候再问你吧:)
    by Laser.NET(匿名) on 2005/4/13 14:24:00
  • re: 又一个语言识别工具(ANTLR)
    这个语法看起来的确很复杂,其实从根本来说,ANTLR就是一个生成器,只不过它只生成识别语言的源代码,道理与我的DCG类似,我的采用ASP的写法就足够了,不过ANTLR要自己有一个写法才可以(也就是它的...
    by Cavingdeep(匿名) on 2005/4/12 17:42:00
  • re: 又一个语言识别工具(ANTLR)
    语法有点看不懂,呵呵,有没有语法介绍啊? <br>看来cavingdeep的编译原理的基本功很扎实嘛!!赞一下:)
    by Laser.NET(匿名) on 2005/4/12 16:45:00

广告

又一个语言识别工具(ANTLR)

刚刚看到《动态计算字串表达式值的类》,好像有许多人表示更喜欢解析器形式的求值类。其实我个人倒觉得用反射实现没什么不好,恰恰相反,我觉得这种实现方法很聪明!另外,装配中的脑袋的代码可以稍微修改一下来提高效率,那样再用的话就不会因为反复编译而影响效率了。

言规正传,不知道大家有没有注意我最近在Blog中添加了一个叫ANTLR的连接,它就是一个著名的“编译器的编译器”,不过它实际上是ANother Tool for Language Recognition(ANTLR),它的描述语言可以生成词法分析器、语法分析器与语义分析器,也就是说,我们可以用它来识别加工不同的语言(编译器的编译器)。它同时支持3大类语言的输出:C++, Java, C#(按照生日排序),也就是说,我们可以利用它来用C#生成编译器。ANTLR是免费开源的,而且历史也很久远了,目前的版本是2.7.5,有兴趣的朋友可以在我的Blog的连接中找到网址。

那么,除了用反射轻松的实现计算值之外我们也可以用ANTLR来描述这些数学表达式,下面我附上一个我在看到《动态计算字串表达式值的类》后写的一个语法文件,感兴趣的朋友可以去下载ANTLR来试一试下面的语法哦!

文件Calc.g

header
{
using CharBuffer = antlr.CharBuffer;
}
options
{
language = "CSharp";
namespace = "Cavingdeep.Test.Calc";
}
/******************************\
Calc Parser
\******************************/
class CalcParser extends Parser;
options
{
exportVocab = Calc;
buildAST = true;
}
expr
: sumExpr EOF
;
sumExpr
: mulExpr ( ( SUM^ | NEG^ ) mulExpr )*
;
mulExpr
: powExpr ( ( MUL^ | DIV^ ) powExpr )*
;
powExpr
: negExpr ( POW^ negExpr )*
;
negExpr
: ( NEG^ )* a:atom!
{
if (#negExpr != null) {
AST lastNegNode = #negExpr;
while (lastNegNode.getNumberOfChildren() > 0) {
lastNegNode = lastNegNode.getFirstChild();
}
lastNegNode.setFirstChild(#a);
} else {
## = #a;
}
}
;
atom
: NUMBER
| LCURLY! sumExpr RCURLY!
;

/***************************\
Calc Lexer
\***************************/
class CalcLexer extends Lexer;
options
{
caseSensitive = false;
exportVocab = Calc;
}
WS
: ( ' '
| '\t'
| '\n'
| '\r' )+ { $setType(Token.SKIP); }
;
NUMBER
: ( ( '0'..'9' )+ '.' ( '0'..'9' )+ ) => ( '0'..'9' )+ '.' ( '0'..'9' )+
| '0'..'9'
;
SUM : '+' ;
NEG : '-' ;
MUL : '*' ;
DIV : '/' ;
POW : '^' ;
LCURLY : '(' ;
RCURLY : ')' ;

/***************************\
Calc Tree Parser
\***************************/
class CalcTreeParser extends TreeParser;
options
{
exportVocab = Calc;
}
{
public static void Main(string[] args) {
CalcLexer lexer = new CalcLexer(new CharBuffer(Console.In));
CalcParser parser = new CalcParser(lexer);
parser.expr();
AST ast = parser.getAST();
CalcTreeParser treeParser = new CalcTreeParser();

double r = treeParser.eval(ast);
Console.WriteLine("结果是:" + r);
}
}
eval returns [double v = 0]
: v=expr
;
protected
expr returns [double v = 0]
{
double izq = 0;
double der = 0;
}
: i:NUMBER { v = Convert.ToDouble(i.getText()); }
| #( SUM izq=expr der=expr ) { v = izq + der; }
| #( DIV izq=expr der=expr ) { v = izq / der; }
| ( #( NEG expr expr ) ) => #( NEG izq=expr der=expr ) { v = izq - der; }
| #( MUL izq=expr der=expr ) { v = izq * der; }
| #( POW izq=expr der=expr ) { v = Math.Pow(izq, der); }
| #( NEG izq=expr ) { v = -(izq);}
;

posted on 2005-04-05 15:24:00 by cavingdeep  评论(18) 阅读(15502)

使用Subversion做.NET项目

前段时间经常听说很多关于Subversion的好话,所以我决定也是时候真正体验一下了(我一直都是关注Subversion的哦)。Subversion相对CVS来讲有以下几点优势:

  1. 增加了元数据(Meta-data)的版本控制,Subversion有很多设置都是通过元数据实现的。
  2. 增加了文件夹的版本控制,没有文件夹的版本控制是CVS中一个很大的不足,这点在Subversion中得到了解决。
  3. 支持文件、文件夹的重命名与移动,好处多多,方便多多,不用再描述了吧。
  4. 真正的原子提交(Truly Atomic Commits),提交作为一个事务,如果某一受控对象提交失败,那么其他提交的对象也不会有效。这个功能真是一个字:好!同时支持不同仓库(Repository)中受控对象的同时提交。
  5. 一些性能上的优化,如分支(Branching)与标签(Tagging)会采用文件夹的受控方式达到优化。

Subversion在使用习惯上与CVS最大的不同之处在我看来就是它的修订号(Revision)的定义了。Subversion中修订号不是针对某个特定的受控对象的,而是针对整个仓库的,你在Subversion中不会说“文件A的第4个修订”,而是“仓库修订4中的文件A”,每一次提交都会导致仓库修订号的增加。更多关于Subversion的介绍请看它自带的文档,这里就不叙述了。

如果你决定使用Subversion,那么你很可能需要下面几个软件(免费开源):

  1. Subversion服务器与客户端(http://subversion.tigris.org),官方版本,我采用的版本是1.1.3。Windows下建议下载安装文件包,因为安装更全面,而且会自动配置环境。
  2. TortoiseSVN(http://tortoisesvn.tigris.org),官方版本,Windows下有两个,一个是常规版本,一个是为VS.NET 2003及更低版本Web项目不支持.svn文件夹的bug所做的非常规版本。非常规版本数据不能与其他版本通用,所以不建议使用,更多信息请看Subversion的相关文档。
  3. SVNService(http://dark.clansoft.dk/~mbn/svnservice/),可选。可以安装一个Windows服务来运行svnserve服务器(Subversion的独立服务器。Subversion可以使用两种服务器,Apache作为服务器或者它自带的svnserve)。

依次安装后就可以使用Subversion了。与CVS同样,Subversion(SVN)分为客户端与服务端,首先你可以用TortoiseSVN建一个仓库(Repository),注意这个操作是在服务端,然后你要选择一种连接到仓库的方法(在客户端),有以下五种:

  1. file:///ReposPath/RepoPath,以文件的形式直接访问,最简单的连接方法,不需要服务器,权限由操作系统来控制,如果后台仓库你采用了FSFS(文本)格式的话那么还可以在局域网共享中使用。
  2. http://host/Repos/Repo,如果你采用了Apache作为服务器的话就可以以这种形式访问,权限由Apache设置。
  3. https://host/Repos/Repo,与上一个一样,同时采用了HTTPS加密通信。
  4. svn://host/Repos/Repo,如果你采用了svnserve作为服务器的话那么就可以采用这种形式访问,它是一种基于TCP/IP的访问方式。权限由仓库的配置文件设置。
  5. svn+ssh://Repos/Repo,与上一个一样,同时采用了SSH的加密通信。

有了连接的URL后就可以用TortoiseSVN连接到仓库了,然后你就可以开始真正使用Subversion了。其他的我就不说了,有兴趣可以自己看看文档,推荐首先阅读TortoiseSVN的文档,Subversion的文档复杂度有些高,不宜初学者!

posted on 2005-03-22 15:16:00 by cavingdeep  评论(20) 阅读(14750)

使用CVS做.NET项目

通常如果使用VS.NET的话会理所当然的使用VSS作为版本管理系统,但是VSS并不像其他版本管理系统那样强大,另外它也是要花钱的。相对CVS是Java上受众较广的一个版本管理系统,免费,功能强大而结构简单。不过不是因为是免费的所以稳定性不好,如果选择一个较稳定的版本的话CVS还是非常可靠的。如果要对比CVS与VSS的话那么我想你一定会更喜欢CVS的。这里就不作比较了,不是本文的目的,本文的目的是告诉你如何在.NET项目下使用CVS管理版本。

第一步就是下载相关软件,以下是需要的软件,全部免费并且开源:

  1. CVSNT(http://www.cvsnt.com/),CVS是一个真正的C/S版本管理系统,所以有服务器和客户端的说法。CVSNT是CVS服务器中的佼佼者,要比官方网站的好的多,而且支持多个平台,是目前使用最广泛的CVS(包括客户端)。记住一定要挑一个稳定的版本哦,一般相对旧一些的稳定版本才是真正的稳定版本。

  2. TortoiseCVS(http://sourceforge.net/projects/tortoisecvs),CVS在Windows下的客户端,这个东东做的非常好,与Windows Explorer紧密集成,CVS这么复杂的系统使用这个客户端就简单多了。

    本来还有一个产品叫CVS SCC Proxy插件,可以使微软的多个IDE拥有直接访问CVS的功能,但是这个插件不是免费的(虽然也不是很贵),而且目前还有许多功能上的不足以及bug,所以我没有打算采用它。不过插件的集成效果倒是非常的好,在VS.NET中与操作VSS没什么两样,除了CVS本身的功能要比VSS多一些除外。

  3. WinMerge(http://sourceforge.net/projects/winmerge),一个比对与合并的软件,TotoiseCVS可以用它来做版本比较与合并操作。

依次安装,安装好后就可以使用CVS做版本管理了。CVS并不是一个非常直观的软件,使用它还是需要一段过程的,一般相关软件的文档中都有教材告诉你如何使用CVS,这里就不叙述了。以下是TortoiseCVS在使用中的图片。

posted on 2005-02-17 09:44:00 by cavingdeep  评论(11) 阅读(8186)

Powered by: Joycode.MVC引擎 0.5.2.0