日韩性视频-久久久蜜桃-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免费久久 | 中国妇女做爰视频 | 免费观看成人 | 日韩一区二区三区在线观看 | 国产精品成人电影在线观看 | 成人国产精品免费观看动漫 | 91成人综合 | 欧美极品jizzhd欧美仙踪林 | 五月婷婷激情小说 | 欧美性在线视频 | 欧美成人影院 | 亚洲少妇15p | 国产在线视频第一页 | 中文字幕在线网 | 啪啪免费 | 性――交――性――乱a | 狠狠干影视| 亚洲图片88 | √天堂 | 成人日b视频 | 91视频免费观看网站 | 国产成人久久婷婷精品流白浆 | 巨茎大战刘亦菲 | 致命弯道8在线观看免费高清完整 | 成人午夜sm精品久久久久久久 | 亚洲一区在线观看视频 | 狂野欧美性猛交免费视频 | 中文字字幕在线中文 | 夫妻精品 | 岛国av免费在线观看 | 成年人免费黄色片 | 激情视频91 | 日本免费www | 亚色影库 | 亚洲成人黄色 | 色丁香六月 | 亚洲人成人一区二区在线观看 | 亚洲精品综合精品自拍 | 友田真希一区二区 | 国产伦精品一区二区三区视频孕妇 | 欧美日韩成人一区二区三区 | 黄色成人免费网站 | xxxx69国产| 欧美一区影院 | 另类ts人妖一区二区三区 | 亚洲自拍电影 | 尤物在线视频 | 91丨porny丨中文 | 亚洲伊人精品 | 午夜极品| 都市激情 亚洲 | 偷偷色噜狠狠狠狠的777米奇 | 欧美日韩国产高清视频 | 亚洲欧美一区二区三区在线观看 | 久久黄网站 | 激情一区二区三区 | 中国videosex高潮hd | 国模无码国产精品视频 | 欧美黑人性猛交xxxx | 国产精品毛片一区二区在线看舒淇 | 亚洲一区二区人妻 | 99热最新网址| 欧美mv日韩mv国产网站app | 色人阁五月天 | 五月天精品视频 | 黑白配在线观看免费观看 | av资源新版在线天堂 | 欧美日韩国产在线观看 | 国产视频1区 | 麻豆传谋在线观看免费mv | 天天摸天天射 | 波多野结衣高清在线 | 国产三级国产精品国产国在线观看 | 色老汉av一区二区三区 | 免费毛片视频网站 | 日本美女啪啪 | 午夜精品久久久久久久四虎美女版 | 欧美综合久久久 | japan高清日本乱xxxxx | 亚洲美女综合网 | 一区二区有码 | 国产精品美女在线 | 国产日韩一区二区 | 中文字幕日本 | 射黄视频 | 一本久草| 欧美不卡影院 | 视色网| 天天色小说 | 成人免费一区二区三区在线观看 | 青青在线 | 鲁片一区二区三区 | 蜜臀久久 | 亚洲狠狠丁香婷婷综合久久久 | 免费看裸体视频网站 |