日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

antlr idea 入门_ANTLR入门:构建简单的表达语言

發布時間:2023/12/3 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 antlr idea 入门_ANTLR入门:构建简单的表达语言 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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入门:构建简单的表达语言的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 激情av在线播放 | 日韩少妇av | 亚洲黄色录像 | 在线观看中出 | 日韩精品电影一区二区 | 久久99一区二区 | 天天尻| 久久6| aa一级黄色片 | 日本少妇在线 | 调教一区二区三区 | 久久不射网站 | av久久久| 久久久久无码精品国产 | 国产亚洲视频一区 | 日韩精品在线观看一区二区 | 三上悠亚痴汉电车 | 国产精品免费av一区二区三区 | 成人av激情 | 免费看黄色三级 | 天天爽夜夜爽夜夜爽 | 成人免费久久 | 奶水旺盛的女人伦理 | 久久五月天婷婷 | 国产日韩av在线播放 | 二区影院 | 欧美a级在线| 欧美另类国产 | 精品一区二区久久久久蜜桃 | 在线视频h | 亚洲av无码乱码在线观看性色 | 熟女一区二区三区视频 | 北条麻妃一区二区三区 | 亚洲com | 天天插天天狠天天透 | 日本www在线 | 6996电视影片免费看 | 国产在线观看免费网站 | 91看片黄| 精品人妻少妇一区二区三区 | 亚洲视频免费在线 | 黑人与日本少妇高潮 | 欧美不卡 | 青青视频免费在线观看 | 6080一级片| 精品一区久久 | 午夜香蕉 | 日韩a在线播放 | 久久国产二区 | 法国空姐 在线 | 日本一区二区三区四区五区 | 国模大尺度视频 | 久久国内精品视频 | 国产a级精品 | 中文字幕一区二区人妻电影丶 | 岛国二区三区 | 欧美一区二区网站 | 亚洲免费在线观看视频 | 中文字幕高清 | 欧美日韩一区二 | 天天躁日日躁狠狠躁欧美 | 国产精品久久久91 | 日韩av一卡 | 日韩夜夜高潮夜夜爽无码 | 久久精品综合网 | 三级黄色网 | 国产调教打屁股xxxx网站 | 无码日本精品xxxxxxxxx | 一区二区三区小说 | 99久久99久久精品国产片 | 精品伦精品一区二区三区视频密桃 | 日本午夜一级 | 视频在线| 佐佐木明希电影 | 自拍偷拍电影 | 欧美日韩一级视频 | 婷婷色一区二区三区 | 国产精品久久久久野外 | 日韩成人av一区 | 日韩激情小视频 | 91se在线| va在线播放| 无码人妻少妇伦在线电影 | 在线观看麻豆av | 日韩av片在线播放 | 一级成人免费 | 麻豆入口| 色婷婷综合久久久久中文 | 国产第三页 | 黄色大片免费的 | 无码人妻aⅴ一区二区三区玉蒲团 | 理想之城连续剧40集免费播放 | 尤物视频在线免费观看 | 国产精品久久久久久久久免费桃花 | 好屌妞视频这里只有精品 | 日韩欧美一卡 | 久久亚洲热| av在线播放免费 | 污污视频在线播放 |