feat: リストを追加

This commit is contained in:
usbharu 2024-11-12 21:44:50 +09:00
parent 9a9de9e062
commit a14906e729
Signed by: usbharu
GPG Key ID: 8CB1087135660B8D
3 changed files with 114 additions and 4 deletions

View File

@ -20,12 +20,23 @@ class Lexer {
'>', '' -> quote(iterator, tokens) '>', '' -> quote(iterator, tokens)
'-', '=', 'ー', '' -> { '-', '=', 'ー', '' -> {
if (iterator.peekOrNull()?.isWhitespace() == true) { //-の直後がスペースならリストの可能性 if (iterator.peekOrNull()?.isWhitespace() == true) { //-の直後がスペースならリストの可能性
list(iterator, tokens, next) list(iterator, tokens)
} else {//それ以外ならセパレーターの可能性 } else {//それ以外ならセパレーターの可能性
separator(next, iterator, tokens) separator(next, iterator, tokens)
} }
} }
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '', '', '', '', '', '', '', '', '', '' ->
decimalList(iterator, tokens, next)
'[', '「' -> {
tokens.add(SquareBracketStart)
}
']', '」' -> {
tokens.add(SquareBracketEnd)
}
' ', ' ' -> { ' ', ' ' -> {
tokens.add(Whitespace(skipWhitespace(iterator) + 1, next)) //nextの分1足す tokens.add(Whitespace(skipWhitespace(iterator) + 1, next)) //nextの分1足す
} }
@ -53,11 +64,31 @@ class Lexer {
return tokens return tokens
} }
private fun list( private fun decimalList(
iterator: PeekableCharIterator, iterator: PeekableCharIterator,
tokens: MutableList<Token>, tokens: MutableList<Token>,
next: Char next: Char
) { ) {
val comma = iterator.peekOrNull()
if (comma == null) {
tokens.add(Text(next.toString()))
return
}
if (comma == '.' || comma == '。' || comma == '、') {
iterator.next()
if (iterator.peekOrNull()?.isWhitespace() == true) {
iterator.next()
tokens.add(DecimalList(next))
return
}
}
tokens.add(Text(next + "" + comma))
}
private fun list(
iterator: PeekableCharIterator,
tokens: MutableList<Token>
) {
if (iterator.peekOrNull()?.isWhitespace() == true) { if (iterator.peekOrNull()?.isWhitespace() == true) {
tokens.add(DiscList) tokens.add(DiscList)

View File

@ -16,5 +16,7 @@ abstract class List(val type: ListType) : Token() {
} }
data object DiscList : List(ListType.DISC) data object DiscList : List(ListType.DISC)
data class DecimalList(val number: Int) : List(ListType.DECIMAL) data class DecimalList(val number: Char) : List(ListType.DECIMAL)
data class CheckBox(val checked:Boolean): Token() data class CheckBox(val checked: Boolean) : Token()
data object SquareBracketStart : Token()
data object SquareBracketEnd : Token()

View File

@ -331,4 +331,81 @@ class LexerTest {
assertContentEquals(listOf(DiscList, Text("aiueo"), Break(1), DiscList, Text("abcd")), actual) assertContentEquals(listOf(DiscList, Text("aiueo"), Break(1), DiscList, Text("abcd")), actual)
} }
@Test
fun ディスクリストネスト() {
val lexer = Lexer()
val actual = lexer.lex("- aiueo\n - abcd")
println(actual)
assertContentEquals(
listOf(DiscList, Text("aiueo"), Break(1), Whitespace(4, ' '), DiscList, Text("abcd")),
actual
)
}
@Test
fun 数字リスト() {
val lexer = Lexer()
val actual = lexer.lex("1. aiueo\n 2. abcd")
println(actual)
assertContentEquals(
listOf(
DecimalList('1'),
Text("aiueo"),
Break(1),
Whitespace(4, ' '),
DecimalList('2'),
Text("abcd")
),
actual
)
}
@Test
fun 全角数字リスト() {
val lexer = Lexer()
val actual = lexer.lex(". aiueo\n . abcd")
println(actual)
assertContentEquals(
listOf(
DecimalList(''),
Text("aiueo"),
Break(1),
Whitespace(4, ' '),
DecimalList(''),
Text("abcd")
),
actual
)
}
@Test
fun 全角コンマリスト() {
val lexer = Lexer()
val actual = lexer.lex("1。 aiueo\n 2、 abcd")
println(actual)
assertContentEquals(
listOf(
DecimalList('1'),
Text("aiueo"),
Break(1),
Whitespace(4, ' '),
DecimalList('2'),
Text("abcd")
),
actual
)
}
} }