Как ANTLR может анализировать отсутствующие элементы в списке как ноль (или какое-либо другое значение заполнителя)? Следующие выражения должны различаться через интерфейс посетителя.
[1,,2]
[1,2,]
[,1,2]
Вот пример грамматики:
grammar Test;
list : '[' elems+=number? (',' elems+=number?)* ']';
number : DIGIT+;
DIGIT: [0-9];
А вот тестовая программа, написанная на Kotlin:
fun main(args: Array<String>) {
println(doTest("[1,2,]")) // Actual: [1, 2] Expected: [1, 2, null]
println(doTest("[1,,2]")) // Actual: [1, 2] Expected: [1, null, 2]
println(doTest("[,1,2]")) // Actual: [1, 2] Expected: [null, 1, 2]
}
fun doTest(input: String): List<Int?> {
val lexer = TestLexer(CharStreams.fromString(input))
val tokens = CommonTokenStream(lexer)
val parser = TestParser(tokens)
return Visitor.visit(parser.list())
}
object Visitor : TestBaseVisitor<List<Int?>>() {
override fun visitList(ctx: TestParser.ListContext): List<Int?> =
ctx.elems.map { s -> s.text.toIntOrNull() }
}
В результате получается список типа [1,2]
для всех трех выражений. Какие изменения я могу внести, чтобы различать эти входные данные?