C#用ANTLR4實現加減乘除小學生數學利器,高級程序員思想

主要使用C#,ANTLR4,winform實現改效果

小學生的高等數學,智能計算器,主要學習思想,高等程序員必備思想,有更好想法的歡迎發表看法

先看效果圖:如下

C#用ANTLR4實現加減乘除小學生數學利器,高級程序員思想

文法示例,專業術語文法,不懂留言或者多多百度和*** 整個加減乘除的詞法的語法就由以下幾行的antlr4代碼來實現,先貼在下面:

/** * Define a grammar called Hello */

// 以下以小寫字母開頭的文法表示爲語法元素

// 由大寫字母開頭的文法表示爲詞法元素

// 詞法元素的表示類似於正則表示式

// 語法元素的表示類似於BNF

grammar ExprCombined;

expr :(Int|String) #basic

|expr op=(Mul|Div) expr #mulDivExpr

|expr op=(Add|Min) expr #addMinExpr

| LPAREN expr RPAREN #groupExpr ;

RPAREN : ')' ;

LPAREN : '(' ;

Add :'+';

Min :'-';

Mul :'*';

Div :'/';

String : '"' ~'"'+ '"';

Int:[0-9]+;

Identifier : Letter LetterOrDigit* ;

WS : [ \t\r\n]+ -> channel(HIDDEN) ;

fragment Letter : [a-zA-Z_] ;

fragment LetterOrDigit : [a-zA-Z0-9_] ;

這段文法寫好運行會產生文件在obj文件夾下面就可以了 接下去實現方法

class MyExprCombinedVisitor : ExprCombinedBaseVisitor{

public override Result VisitBasic(ExprCombinedParser.BasicContext context)

{

return new Result() {

Value = int.Parse(context.Int().GetText())

}; // return context.Int() }

public override Result VisitMulDivExpr(ExprCombinedParser.MulDivExprContext context) {

var leftElemnt = context.expr(0);

var rightElemnt = context.expr(1);

var leftValue=int.Parse(((Result)this.Visit(leftElemnt)).Value.ToString());

var rightValue = int.Parse(((Result)this.Visit(rightElemnt)).Value.ToString());

if (context.op.Type == ExprCombinedParser.Mul) {

return new Result() { Value = leftValue*rightValue };

}

else { r

eturn new Result() {

Value = leftValue / rightValue };

}

}

public override Result VisitAddMinExpr(ExprCombinedParser.AddMinExprContext context)

{

var leftElemnt = context.expr(0);

var rightElemnt = context.expr(1);

//context.expr(<>)

var leftValue = int.Parse(((Result)this.Visit(leftElemnt)).Value.ToString());

var rightValue = int.Parse(((Result)this.Visit(rightElemnt)).Value.ToString());

if (context.op.Type == ExprCombinedParser.Add) { return new Result() { Value = leftValue + rightValue }; } else { return new Result() { Value = leftValue - rightValue };

}

}

public override Result VisitGroupExpr(ExprCombinedParser.GroupExprContext context) {

return this.Visit(context.expr());

}

方法已經實現,然後就是調用了

public class ExprHelper { public static string ParseSQL(string pSqlStatement) { string rSql = string.Empty; AntlrInputStream antlrInputStream = new AntlrInputStream(pSqlStatement); ExprCombinedLexer sqlLexer = new ExprCombinedLexer(antlrInputStream); CommonTokenStream tokens = new CommonTokenStream(sqlLexer); ExprCombinedParser sqlParser = new ExprCombinedParser(tokens); IParseTree tree = sqlParser.expr(); //ParseTreeWalker walker = new ParseTreeWalker(); MyExprCombinedVisitor visitor = new MyExprCombinedVisitor(); Result result = visitor.Visit(tree); //MySQLParserListener mySqlParserListener = new MySQLParserListener(tokens); //walker.Walk(mySqlParserListener, tree); // SQLLexer tSqlLexer=new SQLLexer(pSqlStatement); return result.Value.ToString(); } } private void button1_Click(object sender, EventArgs e) { textBox2.Text = ExprHelper.ParseSQL(textBox1.Text); } 程序員的女朋友就是不會牢騷的程序,發脾氣來是你一時半會改不了的bug,和天氣一樣,看它心情 是不是實現起來很簡單,不理解的人,可以留言,要demo的也請留言email


作者:頭條號 / 世道如今
鏈接:http://www.toutiao.com/i6320071755708760577/
來源:頭條號(今日頭條旗下創作平臺)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章