Skip to content

Commit 1c27f92

Browse files
feat: added single and multiline comments to the dsl
1 parent 477f09f commit 1c27f92

File tree

17 files changed

+465
-11
lines changed

17 files changed

+465
-11
lines changed

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

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,22 @@ class LexerBuilder internal constructor() {
1414
internal var ignorePattern: Regex = Lexer.Defaults.ignorePattern
1515
private set
1616

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+
1723
/**
1824
* The lexer will skip over any strings that match this regex.
1925
* This acts like a token separator.
2026
*
27+
* ```kt
28+
* val myLexer = lexer {
29+
* ignorePatterns(Regex("""\s+"""))
30+
* }
31+
* ```
32+
*
2133
* @param regex regex of the pattern the lexer will not tokenize.
2234
*
2335
* @see Lexer.Defaults.ignorePattern
@@ -27,6 +39,48 @@ class LexerBuilder internal constructor() {
2739
fun ignorePattern(regex: Regex) {
2840
ignorePattern = regex
2941
}
42+
43+
/**
44+
* When the lexer identifies a [singleLineComments] pattern, it will skip to the next line
45+
* and return the next token.
46+
*
47+
* ```kt
48+
* val myLexer = lexer {
49+
* singleLineComments(Regex("//"))
50+
* }
51+
* ```
52+
*
53+
* @param singleLineComments regex of the pattern the lexer will skip over to the next line.
54+
*
55+
* @see Lexer.Defaults.singleLineComments
56+
* @author Nishant Aanjaney Jalan
57+
* @since 0.2.0
58+
*/
59+
fun singleLineComments(singleLineComments: Regex) {
60+
this.singleLineComments = singleLineComments
61+
}
62+
63+
/**
64+
* There are two parts to [multilineComments]: the starting and the ending pattern.
65+
* When the lexer identifies the starting pattern, it will continue to skip to the next possible token
66+
* until it meets the ending pattern.
67+
*
68+
* ```kt
69+
* val myLexer = lexer {
70+
* // You don't need the square brackets but KDoc doesn't like it...
71+
* multiLineComments(Regex("[/][*]") to Regex("[*][/]"))
72+
* }
73+
* ```
74+
*
75+
* @param singleLineComments regex of the pattern the lexer will skip over to the next line.
76+
*
77+
* @see Lexer.Defaults.singleLineComments
78+
* @author Nishant Aanjaney Jalan
79+
* @since 0.2.0
80+
*/
81+
fun multiLineComments(multilineComments: Pair<Regex, Regex>) {
82+
this.multilineComments = multilineComments
83+
}
3084
}
3185

3286
/**
@@ -52,6 +106,8 @@ fun lexer(init: LexerBuilder.() -> Unit): Lexer {
52106
val builder = LexerBuilder()
53107
builder.init()
54108
return Lexer(
55-
ignorePattern = builder.ignorePattern
109+
ignorePattern = builder.ignorePattern,
110+
singleLineComments = builder.singleLineComments,
111+
multilineComments = builder.multilineComments
56112
)
57113
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ import io.github.cybercodernaj.parkour.utils.Position
4545
*/
4646
class Lexer internal constructor(
4747
private val ignorePattern: Regex = Defaults.ignorePattern,
48-
private val singleLineComments: Regex? = null,
49-
private val multilineComments: Pair<Regex, Regex>? = null,
48+
private val singleLineComments: Regex? = Defaults.singleLineComments,
49+
private val multilineComments: Pair<Regex, Regex>? = Defaults.multilineComments,
5050
private val identifiers: Regex = Defaults.identifiers,
5151
private val hardKeywords: Set<String> = emptySet(),
5252
private val operators: Set<String> = emptySet(),
@@ -72,6 +72,8 @@ class Lexer internal constructor(
7272
* @since 0.2.0
7373
*/
7474
val ignorePattern = Regex("""\s+""")
75+
val singleLineComments: Regex? = null
76+
val multilineComments: Pair<Regex, Regex>? = null
7577
val identifiers = Regex("""[a-zA-Z_]\w*""")
7678
val integerLiterals = Regex("""[-+]?[0-9_]+""")
7779
val floatingLiterals = Regex("""[-+]?[0-9_]*\.[0-9_]+(?:[eE][-+]?[0-9_]+)?""")

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,37 @@ class LexerBuilderTest {
2727
)
2828
)
2929
}
30+
31+
@Test
32+
fun `sets single line comments`() {
33+
val myLexer = lexer {
34+
singleLineComments(Regex("//"))
35+
}
36+
37+
myLexer.source = StringSource("hi // hello\nhru")
38+
assertTokens(
39+
myLexer,
40+
listOf(
41+
Token.Identifier("hi", Position(0, 0), Position(0, 1)),
42+
Token.Identifier("hru", Position(1, 0), Position(1, 2))
43+
)
44+
)
45+
}
46+
47+
@Test
48+
fun `sets multiline comments`() {
49+
val myLexer = lexer {
50+
multiLineComments(Regex("/\\*") to Regex("\\*/"))
51+
}
52+
53+
myLexer.source = StringSource("hi /* hello */\nhru")
54+
assertTokens(
55+
myLexer,
56+
listOf(
57+
Token.Identifier("hi", Position(0, 0), Position(0, 1)),
58+
Token.Identifier("hru", Position(1, 0), Position(1, 2))
59+
)
60+
)
61+
}
3062
}
3163

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
<div class="cover ">
6464
<h1 class="cover"><span>escape</span><wbr><span><span>Sequences</span></span></h1>
6565
</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="escape-sequences.html">escapeSequences</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html">List</a><span class="token operator">&lt;</span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-pair/index.html">Pair</a><span class="token operator">&lt;</span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html">Regex</a><span class="token punctuation">, </span><span class="token punctuation">(</span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html">String</a><span class="token punctuation">)</span><span class="token operator"> -&gt; </span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-char/index.html">Char</a><span class="token operator">&gt;</span><span class="token operator">&gt;</span><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>
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="escape-sequences.html">escapeSequences</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/index.html">List</a><span class="token operator">&lt;</span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-pair/index.html">Pair</a><span class="token operator">&lt;</span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html">Regex</a><span class="token punctuation">, </span><span class="token punctuation">(</span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html">String</a><span class="token punctuation">)</span><span class="token operator"> -&gt; </span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-char/index.html">Char</a><span class="token operator">&gt;</span><span class="token operator">&gt;</span><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#L81">source</a>)</span></span></div></div></div>
6767
</div>
6868
<div class="footer">
6969
<span class="go-to-top-icon"><a href="#content" id="go-to-top-link"></a></span><span>© 2024 Copyright</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>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
<div class="cover ">
6464
<h1 class="cover"><span>floating</span><wbr><span><span>Literals</span></span></h1>
6565
</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-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><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#L77">source</a>)</span></span></div></div></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-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><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>
6767
</div>
6868
<div class="footer">
6969
<span class="go-to-top-icon"><a href="#content" id="go-to-top-link"></a></span><span>© 2024 Copyright</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>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
<div class="cover ">
6464
<h1 class="cover"><span><span>identifiers</span></span></h1>
6565
</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="identifiers.html">identifiers</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#L75">source</a>)</span></span></div></div></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="identifiers.html">identifiers</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#L77">source</a>)</span></span></div></div></div>
6767
</div>
6868
<div class="footer">
6969
<span class="go-to-top-icon"><a href="#content" id="go-to-top-link"></a></span><span>© 2024 Copyright</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>

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,36 @@ <h2 class="">Properties</h2>
144144
</div>
145145
</div>
146146
</div>
147+
<a data-name="-1528482951%2FProperties%2F537371977" anchor-label="multilineComments" id="-1528482951%2FProperties%2F537371977" data-filterable-set=":core:dokkaHtmlPartial/main"></a>
148+
<div class="table-row" data-filterable-current=":core:dokkaHtmlPartial/main" data-filterable-set=":core:dokkaHtmlPartial/main">
149+
<div class="main-subrow keyValue ">
150+
<div class=""><span class="inline-flex">
151+
<div><a href="multiline-comments.html"><span>multiline</span><wbr><span><span>Comments</span></span></a></div>
152+
<span class="anchor-wrapper"><span class="anchor-icon" pointing-to="-1528482951%2FProperties%2F537371977"></span>
153+
<div class="copy-popup-wrapper "><span class="copy-popup-icon"></span><span>Link copied to clipboard</span></div>
154+
</span></span></div>
155+
<div>
156+
<div class="title">
157+
<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="multiline-comments.html">multilineComments</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-pair/index.html">Pair</a><span class="token operator">&lt;</span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html">Regex</a><span class="token punctuation">, </span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html">Regex</a><span class="token operator">&gt;</span><span class="token operator">?</span><span class="token operator"> = </span>null</div></div></div>
158+
</div>
159+
</div>
160+
</div>
161+
</div>
162+
<a data-name="-1941481328%2FProperties%2F537371977" anchor-label="singleLineComments" id="-1941481328%2FProperties%2F537371977" data-filterable-set=":core:dokkaHtmlPartial/main"></a>
163+
<div class="table-row" data-filterable-current=":core:dokkaHtmlPartial/main" data-filterable-set=":core:dokkaHtmlPartial/main">
164+
<div class="main-subrow keyValue ">
165+
<div class=""><span class="inline-flex">
166+
<div><a href="single-line-comments.html"><span>single</span><wbr><span>Line</span><wbr><span><span>Comments</span></span></a></div>
167+
<span class="anchor-wrapper"><span class="anchor-icon" pointing-to="-1941481328%2FProperties%2F537371977"></span>
168+
<div class="copy-popup-wrapper "><span class="copy-popup-icon"></span><span>Link copied to clipboard</span></div>
169+
</span></span></div>
170+
<div>
171+
<div class="title">
172+
<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="single-line-comments.html">singleLineComments</a><span class="token operator">: </span><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html">Regex</a><span class="token operator">?</span><span class="token operator"> = </span>null</div></div></div>
173+
</div>
174+
</div>
175+
</div>
176+
</div>
147177
<a data-name="-1379014957%2FProperties%2F537371977" anchor-label="singleLineString" id="-1379014957%2FProperties%2F537371977" data-filterable-set=":core:dokkaHtmlPartial/main"></a>
148178
<div class="table-row" data-filterable-current=":core:dokkaHtmlPartial/main" data-filterable-set=":core:dokkaHtmlPartial/main">
149179
<div class="main-subrow keyValue ">

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
<div class="cover ">
6464
<h1 class="cover"><span>integer</span><wbr><span><span>Literals</span></span></h1>
6565
</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="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><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#L76">source</a>)</span></span></div></div></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="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><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#L78">source</a>)</span></span></div></div></div>
6767
</div>
6868
<div class="footer">
6969
<span class="go-to-top-icon"><a href="#content" id="go-to-top-link"></a></span><span>© 2024 Copyright</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>

0 commit comments

Comments
 (0)