antlr idea 入门

这是该系列的第一篇文章。 本系列的目的是描述如何创建有用的语言和所有支持工具。

在本文中,我们将开始研究一种非常简单的表达语言。 我们将在语言沙箱中构建它,因此我们将其称为语言Sandy

我认为工具支持对于一种语言至关重要:因此,我们将从一种非常简单的语言开始,但是我们将为此提供丰富的工具支持。 要从一种语言中受益,我们需要解析器,解释器和编译器,编辑器等。 在我看来,构建简单的解析器的材料很多,但是构建使用语言的实用有效所需的其余基础结构的材料却很少。

我想专注于这些方面,使语言小巧但完全有用。 然后,您将能够有机地增长语言。

该代码可在GitHub上找到: https : //github.com/ftomassetti/LangSandbox 。 本文中提供的代码对应于标签01_lexer。

语言

该语言将允许定义变量和表达式。 我们将支持:

  • 整数和十进制文字
  • 变量定义和赋值
  • 基本数学运算(加,减,乘,除)
  • 括号的用法

有效文件的示例:

var a = 10 / 3
var b = (5 + 3) * 2
var c = a / b

我们将使用的工具

我们将使用:

  • ANTLR生成词法分析器和解析器
  • 使用Gradle作为我们的构建系统
  • 用Kotlin编写代码。 鉴于我刚开始学习它,这将是非常基本的Kotlin。

设置项目

我们的构建。 gradle文件将如下所示

buildscript {ext.kotlin_version = '1.0.3'repositories {mavenCentral()maven {name 'JFrog OSS snapshot repo'url  'https://oss.jfrog.org/oss-snapshot-local/'}jcenter()}dependencies {classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"}
}apply plugin: 'kotlin'
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'antlr'repositories {mavenLocal()mavenCentral()jcenter()
}dependencies {antlr "org.antlr:antlr4:4.5.1"compile "org.antlr:antlr4-runtime:4.5.1"compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version"testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"testCompile 'junit:junit:4.12'
}generateGrammarSource {maxHeapSize = "64m"arguments += ['-package', 'me.tomassetti.langsandbox']outputDirectory = new File("generated-src/antlr/main/me/tomassetti/langsandbox".toString())
}
compileJava.dependsOn generateGrammarSource
sourceSets {generated {java.srcDir 'generated-src/antlr/main/'}
}
compileJava.source sourceSets.generated.java, sourceSets.main.javaclean{delete "generated-src"
}idea {module {sourceDirs += file("generated-src/antlr/main")}
}

我们可以运行:

  • ./gradlew想法来生成IDEA项目文件
  • ./gradlew generateGrammarSource生成ANTLR词法分析器和解析器

实施词法分析器

我们将在两个单独的文件中构建词法分析器和解析器。 这是词法分析器:

lexer grammar SandyLexer;// Whitespace
NEWLINE            : '\r\n' | 'r' | '\n' ;
WS                 : [\t ]+ ;// Keywords
VAR                : 'var' ;// Literals
INTLIT             : '0'|[1-9][0-9]* ;
DECLIT             : '0'|[1-9][0-9]* '.' [0-9]+ ;// Operators
PLUS               : '+' ;
MINUS              : '-' ;
ASTERISK           : '*' ;
DIVISION           : '/' ;
ASSIGN             : '=' ;
LPAREN             : '(' ;
RPAREN             : ')' ;// Identifiers
ID                 : [_]*[a-z][A-Za-z0-9_]* ;

现在,我们可以简单地运行./ gradlew generateGrammarSource,并且将根据先前的定义为我们生成词法分析器。

测试词法分析器

测试始终很重要,但是在构建语言时绝对至关重要:如果支持您的语言的工具不正确,这可能会影响您将为其构建的所有程序。 因此,让我们开始测试词法分析器:我们只需要验证词法分析器产生的标记序列就是我们所关注的。

package me.tomassetti.sandyimport me.tomassetti.langsandbox.SandyLexer
import org.antlr.v4.runtime.ANTLRInputStream
import java.io.*
import java.util.*
import org.junit.Test as test
import kotlin.test.*class SandyLexerTest {fun lexerForCode(code: String) = SandyLexer(ANTLRInputStream(StringReader(code)))fun lexerForResource(resourceName: String) = SandyLexer(ANTLRInputStream(this.javaClass.getResourceAsStream("/${resourceName}.sandy")))fun tokens(lexer: SandyLexer): List<String> {val tokens = LinkedList<String>()do {val t = lexer.nextToken()when (t.type) {-1 -> tokens.add("EOF")else -> if (t.type != SandyLexer.WS) tokens.add(lexer.ruleNames[t.type - 1])}} while (t.type != -1)return tokens}@test fun parseVarDeclarationAssignedAnIntegerLiteral() {assertEquals(listOf("VAR", "ID", "ASSIGN", "INTLIT", "EOF"),tokens(lexerForCode("var a = 1")))}@test fun parseVarDeclarationAssignedADecimalLiteral() {assertEquals(listOf("VAR", "ID", "ASSIGN", "DECLIT", "EOF"),tokens(lexerForCode("var a = 1.23")))}@test fun parseVarDeclarationAssignedASum() {assertEquals(listOf("VAR", "ID", "ASSIGN", "INTLIT", "PLUS", "INTLIT", "EOF"),tokens(lexerForCode("var a = 1 + 2")))}@test fun parseMathematicalExpression() {assertEquals(listOf("INTLIT", "PLUS", "ID", "ASTERISK", "INTLIT", "DIVISION", "INTLIT", "MINUS", "INTLIT", "EOF"),tokens(lexerForCode("1 + a * 3 / 4 - 5")))}@test fun parseMathematicalExpressionWithParenthesis() {assertEquals(listOf("INTLIT", "PLUS", "LPAREN", "ID", "ASTERISK", "INTLIT", "RPAREN", "MINUS", "DECLIT", "EOF"),tokens(lexerForCode("1 + (a * 3) - 5.12")))}
}

结论和下一步

我们从第一步开始:设置项目并构建词法分析器。

使这种语言在实践中可用之前,我们还有很长的路要走,但我们还是开始了。 接下来,我们将使用相同的方法来处理解析器:构建一些简单的东西,以便我们可以通过命令行进行测试和编译。

翻译自: https://www.javacodegeeks.com/2016/07/getting-started-antlr-building-simple-expression-language.html

antlr idea 入门

antlr idea 入门_ANTLR入门:构建简单的表达语言相关推荐

  1. ANTLR入门:构建一种简单的表达语言

    这是该系列的第一篇文章. 本系列的目的是描述如何创建有用的语言和所有支持工具. 在本文中,我们将开始研究一种非常简单的表达语言. 我们将在语言沙箱中构建它,因此我们将其称为语言Sandy . 我认为工 ...

  2. java语言编写简易表达式_将简单的表达语言放入Java

    小编典典 您可以看到如何传递所有参数: ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = m ...

  3. 如何:从Spring 4.0快速入门以构建简单的REST-Like API(演练)

    如何:从Spring 4.0快速入门以构建简单的REST-Like API(演练) 关于使用Spring MVC创建Web API的另一篇教程. 不太复杂. 只是一个演练. 生成的应用程序将提供简单的 ...

  4. 【Yocto学习入门】02 - 构建一个简单的Poky参考嵌入式操作系统

    [Yocto学习入门]02 - 构建一个简单的Poky参考嵌入式操作系统 一.开发环境准备 二.下载 Poky 代码 三.配置编译环境 3.1 下载失败情况处理 Failed to fetch URL ...

  5. C#游戏开发快速入门 2.1 构建游戏场景

    C#游戏开发快速入门 2.1  构建游戏场景 如果已经计划好了要编写什么样的游戏,在打开Unity以后,要做的第一件事情就是构建游戏场景(Scene).游戏场景就是玩家游戏时,在游戏视图中看到的一切, ...

  6. 【入门】Pytorch实现简单的图片分类器

    系列文章目录 [入门]Pytorch实现简单的图片分类器 [入门]GPU训练图片分类器 文章目录 系列文章目录 前言 导入库 数据归一化 查看训练集 构造网络 定义损失函数和优化器 开始训练 查看分类 ...

  7. 密码学入门:几种简单的密码

    密码学入门:几种简单的密码 一.维吉尼亚密码       维吉尼亚密码引入了"密钥"的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计.假如以上面第一行代表明文字 ...

  8. ROS2入门教程—创建一个简单的订阅者和发布者(C++版)

    ROS2入门教程-创建一个简单的订阅者和发布者(C++版) 1 创建功能包 2 创建发布者节点 3 设置发布者节点依赖项 4 设置发布者节点编译规则 5 创建订阅者 6 编译并运行   节点是通过RO ...

  9. python绘制梅尔谱图_Python入门到底有多简单(三):填充数据

    目录 1.加载包和数据读取2.数据填充2.1 用数值或字符串填充2.2 用字典填充2.3 method参数填充2.3.1 用前面的值填充2.3.2 用后面的值填充2.3.3 limit限制填充的个数2 ...

最新文章

  1. Beta冲刺 day1
  2. Java实现图片去噪和灰度的类
  3. 解决element-ui table show-summary合计行不显示问题
  4. 集装箱计算机跟踪管理方式,集装箱运输第二章集装箱及其箱务管理(图文)解析.ppt...
  5. ajax前台multipartfile,在SpringBoot中使用Ajax方式MultipartFile上传失败
  6. python 编程服务_Python编写Windows Service服务程序
  7. 2008安装完了找不到_防臭地漏哪种好?防臭地漏怎么安装?一篇文章全了解
  8. FuelPHP 系列(三) ------ Model 模型
  9. 使用JMH做Java微基准测试(四)默认状态测试
  10. Apache Commons CLI 开发命令行工具示例
  11. 工作效率的提升——如何高效沟通,有效降低沟通成本
  12. vscode 编写代码为白色 --解决办法
  13. 雾霾指数预测与城市治理(大数据平台系列)
  14. Android播放器实现横竖屏切换
  15. 测试需要掌握的一些技能
  16. IDEA 资源文件配置中文乱码问题
  17. 运维技能定级标准第5篇——关于运维工程师岗位的规范运维、任务执行力和新技术研究与分享的技能级别设计
  18. 首师大附中科创教育平台 我的刷题记录 3120 LJX的校园:入学典礼
  19. 谷歌表格图表 横坐标 滚动_JS图表:Google表格
  20. 强化学习gym的使用之mountaincar的训练

热门文章

  1. [FFT/IFFT]快速傅里叶(逆)变化 + 递归和递推模板
  2. CF1016F:Road Projects(树形dp)
  3. 不止代码:乘法游戏 题解(区间dp)
  4. P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】
  5. jzoj3086,luogu3831-[SHOI2012]回家的路【最短路,拆点】
  6. 【深搜】骑士游历(ssl 1277)
  7. Redis 的 8 大应用场景
  8. spring boot输出hello world几种方法
  9. 有些事,父母一定不能依着孩子!
  10. 用一年的时间,依靠SEO创造一个成功的网站