Skip to content

Commit 30e2ff2

Browse files
feat: added integer and floating literals to dsl
Also modified configuration other fields
1 parent 94931a9 commit 30e2ff2

File tree

16 files changed

+249
-107
lines changed

16 files changed

+249
-107
lines changed

core/src/main/kotlin/io/github/cybercodernaj/parkour/lexer/LexerBuilder.kt

Lines changed: 34 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,6 @@ import io.github.cybercodernaj.parkour.lexer.internal.Lexer
1111
* @since 0.2.0
1212
*/
1313
class LexerBuilder internal constructor() {
14-
internal var ignorePattern: Regex = Lexer.Defaults.ignorePattern
15-
private set
16-
17-
internal var singleLineComments: Regex? = Lexer.Defaults.singleLineComments
18-
private set
19-
20-
internal var multilineComments: Pair<Regex, Regex>? = Lexer.Defaults.multilineComments
21-
private set
22-
23-
internal var identifiers: Regex = Lexer.Defaults.identifiers
24-
private set
25-
26-
private val _hardKeywords: MutableList<String> = mutableListOf()
27-
internal val hardKeywords: List<String> get() = _hardKeywords
28-
29-
private val _separators: MutableList<String> = mutableListOf()
30-
internal val separators: List<String> get() = _separators
31-
32-
private val _operators: MutableList<String> = mutableListOf()
33-
internal val operators: List<String> get() = _operators
34-
3514
/**
3615
* The lexer will skip over any strings that match this regex.
3716
* This acts like a token separator.
@@ -40,19 +19,15 @@ class LexerBuilder internal constructor() {
4019
*
4120
* ```kt
4221
* val myLexer = lexer {
43-
* ignorePatterns(Regex("""\s+"""))
22+
* ignorePatterns = Regex("""\s+""")
4423
* }
4524
* ```
4625
*
47-
* @param regex regex of the pattern the lexer will not tokenize.
48-
*
4926
* @see Lexer.Defaults.ignorePattern
5027
* @author Nishant Aanjaney Jalan
5128
* @since 0.2.0
5229
*/
53-
fun ignorePattern(regex: Regex) {
54-
ignorePattern = regex
55-
}
30+
var ignorePattern: Regex = Lexer.Defaults.ignorePattern
5631

5732
/**
5833
* When the lexer identifies a [singleLineComments] pattern, it will skip to the next line
@@ -62,19 +37,15 @@ class LexerBuilder internal constructor() {
6237
*
6338
* ```kt
6439
* val myLexer = lexer {
65-
* singleLineComments(Regex("//"))
40+
* singleLineComments = Regex("//")
6641
* }
6742
* ```
6843
*
69-
* @param singleLineComments regex of the pattern the lexer will skip over to the next line.
70-
*
7144
* @see Lexer.Defaults.singleLineComments
7245
* @author Nishant Aanjaney Jalan
7346
* @since 0.2.0
7447
*/
75-
fun singleLineComments(singleLineComments: Regex) {
76-
this.singleLineComments = singleLineComments
77-
}
48+
var singleLineComments: Regex? = Lexer.Defaults.singleLineComments
7849

7950
/**
8051
* There are two parts to [multilineComments]: the starting and the ending pattern.
@@ -86,19 +57,15 @@ class LexerBuilder internal constructor() {
8657
* ```kt
8758
* val myLexer = lexer {
8859
* // You don't need the square brackets but KDoc doesn't like it...
89-
* multilineComments(Regex("[/][*]") to Regex("[*][/]"))
60+
* multilineComments = Regex("[/][*]") to Regex("[*][/]")
9061
* }
9162
* ```
9263
*
93-
* @param multilineComments pair of regexes that define what contents are under comments.
94-
*
9564
* @see Lexer.Defaults.multilineComments
9665
* @author Nishant Aanjaney Jalan
9766
* @since 0.2.0
9867
*/
99-
fun multilineComments(multilineComments: Pair<Regex, Regex>) {
100-
this.multilineComments = multilineComments
101-
}
68+
var multilineComments: Pair<Regex, Regex>? = Lexer.Defaults.multilineComments
10269

10370
/**
10471
* Supply the regex pattern that defines the rules for identifiers.
@@ -110,24 +77,38 @@ class LexerBuilder internal constructor() {
11077
* ```kt
11178
* val myLexer = lexer {
11279
* // If all identifiers must be at least 2 characters and start with a lowercase english alphabet.
113-
* identifiers(Regex("[a-z][a-zA-Z0-9]+"))
80+
* identifiers = Regex("[a-z][a-zA-Z0-9]+")
11481
* }
11582
* ```
11683
*
117-
* @param identifiers regex defining the rules of the naming identifiers
118-
*
11984
* @see Lexer.Defaults.identifiers
12085
* @author Nishant Aanjaney Jalan
12186
* @since 0.2.0
12287
*/
123-
fun identifiers(identifiers: Regex) {
124-
this.identifiers = identifiers
125-
}
88+
var identifiers: Regex = Lexer.Defaults.identifiers
89+
90+
private val _hardKeywords: MutableList<String> = mutableListOf()
91+
internal val hardKeywords: List<String> get() = _hardKeywords
92+
93+
private val _separators: MutableList<String> = mutableListOf()
94+
internal val separators: List<String> get() = _separators
95+
96+
private val _operators: MutableList<String> = mutableListOf()
97+
internal val operators: List<String> get() = _operators
98+
99+
internal var integerLiteral: Regex = Lexer.Defaults.integerLiteral
100+
private set
101+
102+
internal var floatingLiteral: Regex = Lexer.Defaults.floatingLiteral
103+
private set
104+
105+
internal var singleLineString: Set<String> = Lexer.Defaults.singleLineString
106+
private set
126107

127108
/**
128109
* Hard keywords are a characters and symbols that give a particular meaning to a program.
129110
* They may not be used as identifiers.
130-
* (Default: [])
111+
* You can add multiple keywords over many function calls.
131112
*
132113
* ### Usage
133114
*
@@ -146,7 +127,8 @@ class LexerBuilder internal constructor() {
146127
}
147128

148129
/**
149-
* Separators are characters and symbols that act like delimiters to separate other meaningful elements. (Default: [])
130+
* Separators are characters and symbols that act like delimiters to separate other meaningful elements.
131+
* You can add multiple separators over many function calls.
150132
*
151133
* ### Usage
152134
*
@@ -165,7 +147,8 @@ class LexerBuilder internal constructor() {
165147
}
166148

167149
/**
168-
* Operators are characters and symbols that may perform arithmetic or logical operations. (Default: [])
150+
* Operators are characters and symbols that may perform arithmetic or logical operations.
151+
* You can add multiple separators over many function calls.
169152
*
170153
* ### Usage
171154
*
@@ -214,5 +197,8 @@ fun lexer(init: LexerBuilder.() -> Unit): Lexer {
214197
hardKeywords = builder.hardKeywords.sortedByDescending(String::length),
215198
operators = builder.operators.sortedByDescending(String::length),
216199
separators = builder.separators.sortedByDescending(String::length),
200+
integerLiteral = builder.integerLiteral,
201+
floatingLiteral = builder.floatingLiteral,
202+
singleLineString = builder.singleLineString,
217203
)
218204
}

core/src/main/kotlin/io/github/cybercodernaj/parkour/lexer/internal/Lexer.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ class Lexer internal constructor(
5151
private val hardKeywords: List<String> = emptyList(),
5252
private val operators: List<String> = emptyList(),
5353
private val separators: List<String> = emptyList(),
54-
private val integerLiteral: Regex? = Defaults.integerLiterals,
55-
private val floatingLiteral: Regex? = Defaults.floatingLiterals,
54+
private val integerLiteral: Regex? = Defaults.integerLiteral,
55+
private val floatingLiteral: Regex? = Defaults.floatingLiteral,
5656
private val singleLineString: Set<String> = Defaults.singleLineString,
5757
private val escapeSequences: List<Pair<Regex, (String) -> Char>> = Defaults.escapeSequences,
5858
) {
@@ -75,8 +75,8 @@ class Lexer internal constructor(
7575
val singleLineComments: Regex? = null
7676
val multilineComments: Pair<Regex, Regex>? = null
7777
val identifiers = Regex("""[a-zA-Z_]\w*""")
78-
val integerLiterals = Regex("""[-+]?[0-9_]+""")
79-
val floatingLiterals = Regex("""[-+]?[0-9_]*\.[0-9_]+(?:[eE][-+]?[0-9_]+)?""")
78+
val integerLiteral = Regex("""[-+]?[0-9_]+""")
79+
val floatingLiteral = Regex("""[-+]?[0-9_]*\.[0-9_]+(?:[eE][-+]?[0-9_]+)?""")
8080
val singleLineString: Set<String> = setOf("\"", "\'")
8181
val escapeSequences: List<Pair<Regex, (String) -> Char>> = emptyList() // TODO fill this list
8282
}

core/src/test/kotlin/io/github/cybercodernaj/parkour/lexer/LexerBuilderTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class LexerBuilderTest {
1515
@Test
1616
fun `sets ignore patterns`() {
1717
val myLexer = lexer {
18-
ignorePattern(Regex("\\."))
18+
ignorePattern = Regex("\\.")
1919
}
2020

2121
myLexer.source = StringSource("hi.hello")
@@ -31,7 +31,7 @@ class LexerBuilderTest {
3131
@Test
3232
fun `sets single line comments`() {
3333
val myLexer = lexer {
34-
singleLineComments(Regex("//"))
34+
singleLineComments = Regex("//")
3535
}
3636

3737
myLexer.source = StringSource("hi // hello\nhru")
@@ -47,7 +47,7 @@ class LexerBuilderTest {
4747
@Test
4848
fun `sets multiline comments`() {
4949
val myLexer = lexer {
50-
multilineComments(Regex("/\\*") to Regex("\\*/"))
50+
multilineComments = Regex("/\\*") to Regex("\\*/")
5151
}
5252

5353
myLexer.source = StringSource("hi /* hello */\nhru")
@@ -63,7 +63,7 @@ class LexerBuilderTest {
6363
@Test
6464
fun `sets identifiers rule`() {
6565
val myLexer = lexer {
66-
identifiers(Regex("[a-z][a-zA-Z0-9]+"))
66+
identifiers = Regex("[a-z][a-zA-Z0-9]+")
6767
}
6868

6969
myLexer.source = StringSource("hi value")
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<!doctype html>
2+
<html class="no-js">
3+
<head>
4+
<meta name="viewport" content="width=device-width, initial-scale=1" charset="UTF-8">
5+
<title>floatingLiteral</title>
6+
<link href="../../../../images/logo-icon.svg" rel="icon" type="image/svg"> <script>var pathToRoot = "../../../../";</script>
7+
<script>document.documentElement.classList.replace("no-js","js");</script>
8+
<script>const storage = localStorage.getItem("dokka-dark-mode")
9+
if (storage == null) {
10+
const osDarkSchemePreferred = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
11+
if (osDarkSchemePreferred === true) {
12+
document.getElementsByTagName("html")[0].classList.add("theme-dark")
13+
}
14+
} else {
15+
const savedDarkMode = JSON.parse(storage)
16+
if(savedDarkMode === true) {
17+
document.getElementsByTagName("html")[0].classList.add("theme-dark")
18+
}
19+
}
20+
</script>
21+
<script type="text/javascript" src="https://unpkg.com/kotlin-playground@1/dist/playground.min.js" async></script>
22+
<script type="text/javascript" src="../../../../scripts/sourceset_dependencies.js" async></script>
23+
<link href="../../../../styles/style.css" rel="Stylesheet">
24+
<link href="../../../../styles/main.css" rel="Stylesheet">
25+
<link href="../../../../styles/prism.css" rel="Stylesheet">
26+
<link href="../../../../styles/logo-styles.css" rel="Stylesheet">
27+
<link href="../../../../styles/font-jb-sans-auto.css" rel="Stylesheet">
28+
<script type="text/javascript" src="../../../../scripts/clipboard.js" async></script>
29+
<script type="text/javascript" src="../../../../scripts/navigation-loader.js" async></script>
30+
<script type="text/javascript" src="../../../../scripts/platform-content-handler.js" async></script>
31+
<script type="text/javascript" src="../../../../scripts/main.js" defer></script>
32+
<script type="text/javascript" src="../../../../scripts/prism.js" async></script>
33+
<script type="text/javascript" src="../../../../scripts/symbol-parameters-wrapper_deferred.js" defer></script></head>
34+
<body>
35+
<div class="root">
36+
<nav class="navigation" id="navigation-wrapper">
37+
<div class="navigation--inner">
38+
<div class="navigation-title">
39+
<button class="menu-toggle" id="menu-toggle" type="button">toggle menu</button>
40+
<div class="library-name">
41+
<a class="library-name--link" href="../../../../index.html">
42+
Parkour
43+
</a> </div>
44+
<div class="library-version">0.1.0
45+
</div>
46+
</div>
47+
<div class="filter-section" id="filter-section">
48+
<button class="platform-tag platform-selector jvm-like" data-active="" data-filter=":core:dokkaHtmlPartial/main">jvm</button>
49+
</div>
50+
</div>
51+
<div class="navigation-controls">
52+
<button class="navigation-controls--btn navigation-controls--theme" id="theme-toggle-button" type="button">switch theme</button>
53+
<div class="navigation-controls--btn navigation-controls--search" id="searchBar" role="button">search in API</div>
54+
</div>
55+
</nav>
56+
<div id="container">
57+
<div class="sidebar" id="leftColumn">
58+
<div class="sidebar--inner" id="sideMenu"></div>
59+
</div>
60+
<div id="main">
61+
<div class="main-content" data-page-type="member" id="content" pageids="parkour::io.github.cybercodernaj.parkour.lexer.internal/Lexer.Defaults/floatingLiteral/#/PointingToDeclaration//537371977">
62+
<div class="breadcrumbs"><a href="../../../index.html">parkour</a><span class="delimiter">/</span><a href="../../index.html">io.github.cybercodernaj.parkour.lexer.internal</a><span class="delimiter">/</span><a href="../index.html">Lexer</a><span class="delimiter">/</span><a href="index.html">Defaults</a><span class="delimiter">/</span><span class="current">floatingLiteral</span></div>
63+
<div class="cover ">
64+
<h1 class="cover"><span>floating</span><wbr><span><span>Literal</span></span></h1>
65+
</div>
66+
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:dokkaHtmlPartial/main"><div class="symbol monospace"><span class="token keyword">val </span><a href="floating-literal.html">floatingLiteral</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html">Regex</a><span class="clearfix"><span class="floating-right">(<a href="https://github.com/cybercoder-naj/parkour/tree/main/core/src/main/kotlin/io/github/cybercodernaj/parkour/lexer/internal/Lexer.kt#L79">source</a>)</span></span></div></div></div>
67+
</div>
68+
<div class="footer">
69+
<span class="go-to-top-icon"><a href="#content" id="go-to-top-link"></a></span><span>© 2024 Nishant Aanjaney Jalan</span><span class="pull-right"><span>Generated by </span><a href="https://github.com/Kotlin/dokka"><span>dokka</span><span class="padded-icon"></span></a></span>
70+
</div>
71+
</div>
72+
</div>
73+
</div>
74+
</body>
75+
</html>
76+

docs/core/io.github.cybercodernaj.parkour.lexer.internal/-lexer/-defaults/index.html

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,17 +84,17 @@ <h2 class="">Properties</h2>
8484
</div>
8585
</div>
8686
</div>
87-
<a data-name="-606104266%2FProperties%2F537371977" anchor-label="floatingLiterals" id="-606104266%2FProperties%2F537371977" data-filterable-set=":core:dokkaHtmlPartial/main"></a>
87+
<a data-name="-485718095%2FProperties%2F537371977" anchor-label="floatingLiteral" id="-485718095%2FProperties%2F537371977" data-filterable-set=":core:dokkaHtmlPartial/main"></a>
8888
<div class="table-row" data-filterable-current=":core:dokkaHtmlPartial/main" data-filterable-set=":core:dokkaHtmlPartial/main">
8989
<div class="main-subrow keyValue ">
9090
<div class=""><span class="inline-flex">
91-
<div><a href="floating-literals.html"><span>floating</span><wbr><span><span>Literals</span></span></a></div>
92-
<span class="anchor-wrapper"><span class="anchor-icon" pointing-to="-606104266%2FProperties%2F537371977"></span>
91+
<div><a href="floating-literal.html"><span>floating</span><wbr><span><span>Literal</span></span></a></div>
92+
<span class="anchor-wrapper"><span class="anchor-icon" pointing-to="-485718095%2FProperties%2F537371977"></span>
9393
<div class="copy-popup-wrapper "><span class="copy-popup-icon"></span><span>Link copied to clipboard</span></div>
9494
</span></span></div>
9595
<div>
9696
<div class="title">
97-
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:dokkaHtmlPartial/main"><div class="symbol monospace"><span class="token keyword">val </span><a href="floating-literals.html">floatingLiterals</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html">Regex</a></div></div></div>
97+
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:dokkaHtmlPartial/main"><div class="symbol monospace"><span class="token keyword">val </span><a href="floating-literal.html">floatingLiteral</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html">Regex</a></div></div></div>
9898
</div>
9999
</div>
100100
</div>
@@ -129,17 +129,17 @@ <h2 class="">Properties</h2>
129129
</div>
130130
</div>
131131
</div>
132-
<a data-name="-1010963816%2FProperties%2F537371977" anchor-label="integerLiterals" id="-1010963816%2FProperties%2F537371977" data-filterable-set=":core:dokkaHtmlPartial/main"></a>
132+
<a data-name="-1052967409%2FProperties%2F537371977" anchor-label="integerLiteral" id="-1052967409%2FProperties%2F537371977" data-filterable-set=":core:dokkaHtmlPartial/main"></a>
133133
<div class="table-row" data-filterable-current=":core:dokkaHtmlPartial/main" data-filterable-set=":core:dokkaHtmlPartial/main">
134134
<div class="main-subrow keyValue ">
135135
<div class=""><span class="inline-flex">
136-
<div><a href="integer-literals.html"><span>integer</span><wbr><span><span>Literals</span></span></a></div>
137-
<span class="anchor-wrapper"><span class="anchor-icon" pointing-to="-1010963816%2FProperties%2F537371977"></span>
136+
<div><a href="integer-literal.html"><span>integer</span><wbr><span><span>Literal</span></span></a></div>
137+
<span class="anchor-wrapper"><span class="anchor-icon" pointing-to="-1052967409%2FProperties%2F537371977"></span>
138138
<div class="copy-popup-wrapper "><span class="copy-popup-icon"></span><span>Link copied to clipboard</span></div>
139139
</span></span></div>
140140
<div>
141141
<div class="title">
142-
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:dokkaHtmlPartial/main"><div class="symbol monospace"><span class="token keyword">val </span><a href="integer-literals.html">integerLiterals</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html">Regex</a></div></div></div>
142+
<div class="platform-hinted " data-platform-hinted="data-platform-hinted"><div class="content sourceset-dependent-content" data-active="" data-togglable=":core:dokkaHtmlPartial/main"><div class="symbol monospace"><span class="token keyword">val </span><a href="integer-literal.html">integerLiteral</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html">Regex</a></div></div></div>
143143
</div>
144144
</div>
145145
</div>

0 commit comments

Comments
 (0)