CSharp使用ANTLR4生成简单计算Parser
ANTLR简介
ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It's widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser that can build parse trees and also generates a listener interface (or visitor) that makes it easy to respond to the recognition of phrases of interest.
ANTLR(ANother Tool for Language Recognition)是一个强大的生成Parser的工具,用来读取,处理,执行或者翻译结构文本或二进制文件。ANTLR将从grammar生成一个parser,可以构建parse tree 并且生成一个监听接口(或者visitor),并使你更简单的感受到短语识别的乐趣。
本例简介
本例将使用ANTLR生成CSharp parser代码,对减乘除数学表达式进行Parse并执行。源码直接下载吧,点这里。
准备环境
1.ANTLR是一个JAVA程序,所以需要JAVA环境,本例使用的是java version "1.8.0_181"。
2.下载ANTLR https://www.antlr.org/download.html 本例使用Complete ANTLR 4.9.1 Java binaries jar
准备语法文件Simple.g4
grammar Simple;
calc: expr EOF;
expr
:BR_OPEN expr BR_CLOSE
|expr TIMES expr
|expr DIV expr
|expr PLUS expr
|expr MINUS expr
|number
;
number: NUMBER;
PLUS: 'plus' | '+';
MINUS: 'minus' | '-';
TIMES: 'times' | '*';
DIV: 'div' | '/';

NUMBER: '-'? [0-9]+;
BR_OPEN: '(';
BR_CLOSE: ')';
WS: [ \t\r\n]+ -> skip;
生成CSharp代码
命令行执行
java -jar antlr-4.9.1-complete.jar -Dlanguage=CSharp Simple.g4

将生成文件添加至CSharp Project

CSharp Project添加ANTLR runtime引用
Install-Package Antlr4.Runtime.Standard
执行读取到的数学表达式
private static int visit(SimpleParser.ExprContext context)
{
if (context.number() != null)
{ //Just a number
return int.Parse(context.number().GetText());
}
else if (context.BR_CLOSE() != null)
{ //Expression between brackets
return visit(context.expr(0));
}
else if (context.TIMES() != null)
{ //Expression * expression
return visit(context.expr(0)) * visit(context.expr(1));
}
else if (context.DIV() != null)
{ //Expression / expression
return visit(context.expr(0)) / visit(context.expr(1));
}
else if (context.PLUS() != null)
{ //Expression + expression
return visit(context.expr(0)) + visit(context.expr(1));
}
else if (context.MINUS() != null)
{ //Expression - expression
return visit(context.expr(0)) - visit(context.expr(1));
}
else
{
throw new Exception();
}
}
读入输入测试
var input = "2 * 3";
AntlrInputStream inputStream = new AntlrInputStream(input);
SimpleLexer lexer = new SimpleLexer(inputStream);
CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
SimpleParser parser = new SimpleParser(commonTokenStream);
var result = visit(parser.expr());
Console.WriteLine($"input:{input},output:{result}");

尾声
本例简单介绍在CSharp中如何使用ANTLR生成一个Parser,感受了一波短语识别的乐趣,You feel me? 后续ANTLR详细的玩法再给大家分享。
Reference
C# target for ANTLR 4
Antlr is Awesome
CSharp使用ANTLR4生成简单计算Parser的更多相关文章
- Pytorch基础——使用 RNN 生成简单序列
一.介绍 内容 使用 RNN 进行序列预测 今天我们就从一个基本的使用 RNN 生成简单序列的例子中,来窥探神经网络生成符号序列的秘密. 我们首先让神经网络模型学习形如 0^n 1^n 形式的上下文无 ...
- 学习笔记:利用GDI+生成简单的验证码图片
学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...
- 2018-02-18 Antlr4实现简单语言之条件语句
本系列之前的文章: Antlr4的分析错误处理 Antlr4实现数学四则运算 Antlr4添加中文变量赋求值,括号,各种问题 Antlr4: 修改语法规则更接近普通BNF格式 Antlr4实现简单语言 ...
- python应用:生成简单二维码
概述 \(\quad\)第一篇python的应用就打算写一写用python生成简单的二维码啦.因为二维码在日常生活中越来越常用了,部分博客也用二维码来用作打赏的工具.但是要提醒大家的是,千万不要乱扫街 ...
- 通过微软的HTML Help Workshop 利用.html文件 生成简单的chm帮助类的文件
1.下载并安装Microsoft HTML Help Workshop 下载链接:http://www.microsoft.com/en-us/download/details.aspx?id=211 ...
- 使用Swagger生成简单接口文档
使用swagger通过简单的配置可以生成简单的接口文档: 依赖包: // Swagger2 compile 'io.springfox:springfox-swagger2:2.8.0' compil ...
- java 生成简单word(利用Itext工具),生成简单Excel,以及下载笔记
1.java 生成简单word(包含图片表格) pom中加入itext 相关依赖 <dependency> <groupId>com.lowagie</groupId&g ...
- SDUT OJ 2616 简单计算
简单计算 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 某天,XX 给YY 出了一道题,题目是: 给出n 个十进制的数,找出这n ...
- Python简单计算数组元素平均值的方法示例
Python简单计算数组元素平均值的方法示例 本文实例讲述了Python简单计算数组元素平均值的方法.分享给大家供大家参考,具体如下: Python 环境:Python 2.7.12 x64 IDE ...
随机推荐
- poj3693 Maximum repetition substring (后缀数组+rmq)
Description The repetition number of a string is defined as the maximum number R such that the strin ...
- hdu 6863 Isomorphic Strings 哈希+求公因子
题意: t组输入,每组数据输入一个整数n,代表字符串长度.下面再输入一个字符串 你需要判断这个字符串能不能分成大于1段,且这些段的最小表示法是一样的 例如:abccab,它可以分成2段,分别是abc和 ...
- Codeforces Round #479 (Div. 3) D. Divide by three, multiply by two (DFS)
题意:给你一个长度为\(n\)的序列\(a\).对它重新排列,使得\(a_{i+1}=a_{i}/3\)或\(a_{i+1}=2*a_{i}\).输出重新排列后的序列. 题解:经典DFS,遍历这个序列 ...
- Codeforces Round #650 (Div. 3) E. Necklace Assembly (暴力)
题意:有一个字符串,要求使用其中字符构造一个环(不必全部都用),定义一个环是k美的,如果它转\(k\)次仍是原样,现在给你\(k\),要求最长的k美环的长度. 题解:我们首先看\(k\),如果一个环转 ...
- Educational Codeforces Round 56 (Rated for Div. 2) D. Beautiful Graph (二分图染色)
题意:有\(n\)个点,\(m\)条边的无向图,可以给每个点赋点权\({1,2,3}\),使得每个点连的奇偶不同,问有多少种方案,答案对\(998244353\)取模. 题解:要使得每个点所连的奇偶不 ...
- Zabbix 部署配置
监控基本概述 主要的监控工具 1.CACTI:网络监控,Cacti是一套基于PHP,MySQL,SNMP 及 RRDTool 开发的网络流量监测图形分析工具 2.NAGIOS:系统监控,很久之前使用的 ...
- 初学算法之dijkstra
dijkstra的代码思想网上各路高手所述备矣.这里只是存下用邻接矩阵和邻接表实现的dijkstra.(白书代码) 邻接矩阵 1 void dijkstra(int s){ 2 int dis[s]= ...
- CSS3 动态生成内容(在Web中插入内容)====CSS的伪类或者伪元素
# css3 .类:伪类::伪元素 /* CSS3伪元素/伪类 :https://www.w3.org/TR/css3-selectors/#selectors ::selection 伪元素(F12 ...
- css scroll text without wrap & webkit-scrollbar
css scroll text without wrap hidden webkit-scrollbar .tabs-title-box::-webkit-scrollbar, .tabs-conte ...
- 使用 js 和 Beacon API 实现一个简易版的前端埋点监控 npm 包
使用 js 和 Beacon API 实现一个简易版的前端埋点监控 npm 包 前端监控,埋点,数据收集,性能监控 Beacon API https://caniuse.com/beacon 优点,请 ...