主要使用C#,ANTLR4,winform實現改效果
小學生的高等數學,智能計算器,主要學習思想,高等程序員必備思想,有更好想法的歡迎發表看法
先看效果圖:如下
文法示例,專業術語文法,不懂留言或者多多百度和*** 整個加減乘除的詞法的語法就由以下幾行的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/
來源:頭條號(今日頭條旗下創作平臺)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。