您的位置:首页 > 编程语言 > C#

用Irony实现一个计算器附上源码

2016-12-15 10:19 267 查看
满足的功能如下:
加减乘除四则运算
括号优先级

比如:
[align=left]3+2*4 - 8/4 的结果是9[/align]
[align=left]2* (2 + 3) - 2的结果是8[/align]
[align=left]
[/align]
[align=left]Irony是.net平台下实现语言的开发工具箱。作者把C#这种强大的现代语言引入编译器解析领域,语法规则直接通过C#语言来描述。下面看看这个计算器的语法是怎么写的:[/align]
[align=left]
[/align]
[align=left]Terminal num = new NumberLiteral("Number");[/align]
[align=left]NonTerminal expr = new NonTerminal("Expr");[/align]
[align=left]NonTerminal binOp = new NonTerminal("BinOp");[/align]
[align=left]NonTerminal unOp = new NonTerminal("UnOp");[/align]
[align=left]NonTerminal exprLine = new NonTerminal("ExprLine");[/align]
[align=left]
[/align]
[align=left]expr.Rule = num | unOp + expr | expr + binOp + expr | "(" + expr + ")";[/align]
[align=left]binOp.Rule = ToTerm("+") | "-" | "*" | "/";[/align]
[align=left]unOp.Rule = "-";[/align]
[align=left]exprLine.Rule = expr + Eof;[/align]
[align=left]
[/align]
[align=left]this.Root = exprLine;[/align]
[align=left]
[/align]
[align=left]RegisterOperators(1, "+", "-");[/align]
[align=left]RegisterOperators(2, "*", "/");[/align]
[align=left]
[/align]
[align=left]MarkPunctuation("(", ")");[/align]
[align=left]MarkTransient(binOp, unOp);[/align]
[align=left]
[/align]
[align=left]完整代码[/align]
[align=left]https://github.com/booirror/codelab[/align]
[align=left]
[/align]
[align=left]想的太多,做的太少,这是我的毛病。跟人打交道方面更是一塌糊涂。我要改变这些毛病,不贪多,一点点慢慢来,多做多看,学好Lua,看看Lua的源码,看看编译原理,3d游戏开发。跟人对话时,尽量自信点, 反应敏捷点。一年又一年,时间啊,你慢点。[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# Irony 计算器