From e5785659af412db530757e379869fc00f3367600 Mon Sep 17 00:00:00 2001 From: Duncan Mak Date: Thu, 11 Jan 2024 21:06:58 -0500 Subject: [PATCH 1/2] WIP to part lisp-parser.dart --- .../org/petitparser/grammar/lisp/Lisp.kt | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/commonTest/kotlin/org/petitparser/grammar/lisp/Lisp.kt diff --git a/src/commonTest/kotlin/org/petitparser/grammar/lisp/Lisp.kt b/src/commonTest/kotlin/org/petitparser/grammar/lisp/Lisp.kt new file mode 100644 index 0000000..549579c --- /dev/null +++ b/src/commonTest/kotlin/org/petitparser/grammar/lisp/Lisp.kt @@ -0,0 +1,71 @@ +package org.petitparser.grammar.lisp + +import org.petitparser.core.grammar.Grammar +import org.petitparser.core.parser.Parser +import org.petitparser.core.parser.combinator.* +import org.petitparser.core.parser.consumer.CharPredicate.Companion.any +import org.petitparser.core.parser.consumer.CharPredicate.Companion.anyOf +import org.petitparser.core.parser.consumer.CharPredicate.Companion.char +import org.petitparser.core.parser.consumer.CharPredicate.Companion.pattern +import org.petitparser.core.parser.consumer.digit +import org.petitparser.core.parser.consumer.newline +import org.petitparser.core.parser.consumer.whitespace +import org.petitparser.core.parser.misc.end +import org.petitparser.core.parser.repeater.star + +class LispGrammar : Grammar() { + + private val comment by seq(char(';'), newline().not().star()) + private val space by or(whitespace(), ref(comment)) + + private val splice by seq(char('@'), list) + private val unquote by seq(char(','), ref(list)) + private val quasiquote by seq(char('`'), ref(list)) + private val quote by seq(char('\''), ref(atom)) + + private val symbolToken by seqMap( + pattern("a-zA-Z!#\$%&*/:<=>?@\\^_|~+-"), + pattern("a-zA-Z0-9!#\$%&*/:<=>?@\\^_|~+-")).star() + private val symbol = symbolToken.flatten("Symbol expected") + + private val characterRaw = pattern("^\"") + private val characterEscape by seqMap(char('\\'), any()) + private val character by or(ref(characterEscape), ref(characterRaw)) + private val `string` by seq( + char('"'), + character.star(), + char('"')) { _, it, _ -> it} + + + private val empty = ref(space).star() + private val cell by seq(atom, cells) + private val cells by or(ref(cell), ref(empty)) + + private val numberToken by seqMap( + ref(anyOf("-+")).optional(), + char('0') or digit().plus(), + char('.').seq(digit().plus()).optional() & + anyOf('eE').seq(anyOf('-+').optional()).seq(digit().plus()).optional() + ) + private val number = ref(numberToken).flatten("Number expected") + + private val list by seqMap( + char('('), + cell, + char(')'), + ) { _, it, _ -> it.elements } + + + private val atomChoice: Parser by or( + list, + number, + string, + symbol, + quote, + quasiquote, + unquote, + splice + ) + + val start by atomChoice.star().end() +} \ No newline at end of file From c88bf6cd23c0a7ea3775a94b4a3dbdd22df69b62 Mon Sep 17 00:00:00 2001 From: Lukas Renggli Date: Fri, 12 Jan 2024 16:54:20 +0100 Subject: [PATCH 2/2] Make syntax errors in lisp.kt go away Not tested the functionality though ... --- .../org/petitparser/grammar/lisp/Lisp.kt | 73 ++++++++++--------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/src/commonTest/kotlin/org/petitparser/grammar/lisp/Lisp.kt b/src/commonTest/kotlin/org/petitparser/grammar/lisp/Lisp.kt index 549579c..d4f6df2 100644 --- a/src/commonTest/kotlin/org/petitparser/grammar/lisp/Lisp.kt +++ b/src/commonTest/kotlin/org/petitparser/grammar/lisp/Lisp.kt @@ -2,61 +2,66 @@ package org.petitparser.grammar.lisp import org.petitparser.core.grammar.Grammar import org.petitparser.core.parser.Parser -import org.petitparser.core.parser.combinator.* -import org.petitparser.core.parser.consumer.CharPredicate.Companion.any -import org.petitparser.core.parser.consumer.CharPredicate.Companion.anyOf -import org.petitparser.core.parser.consumer.CharPredicate.Companion.char -import org.petitparser.core.parser.consumer.CharPredicate.Companion.pattern +import org.petitparser.core.parser.action.flatten +import org.petitparser.core.parser.combinator.not +import org.petitparser.core.parser.combinator.optional +import org.petitparser.core.parser.combinator.or +import org.petitparser.core.parser.combinator.seq +import org.petitparser.core.parser.consumer.any +import org.petitparser.core.parser.consumer.anyOf +import org.petitparser.core.parser.consumer.char import org.petitparser.core.parser.consumer.digit import org.petitparser.core.parser.consumer.newline +import org.petitparser.core.parser.consumer.pattern import org.petitparser.core.parser.consumer.whitespace import org.petitparser.core.parser.misc.end +import org.petitparser.core.parser.repeater.plus import org.petitparser.core.parser.repeater.star class LispGrammar : Grammar() { private val comment by seq(char(';'), newline().not().star()) - private val space by or(whitespace(), ref(comment)) + private val space by or(whitespace(), comment) - private val splice by seq(char('@'), list) - private val unquote by seq(char(','), ref(list)) - private val quasiquote by seq(char('`'), ref(list)) - private val quote by seq(char('\''), ref(atom)) + private val splice by seq(char('@'), ref(::list)) + private val unquote by seq(char(','), ref(::list)) + private val quasiquote by seq(char('`'), ref(::list)) + private val quote by seq(char('\''), ref(::atom)) - private val symbolToken by seqMap( + private val symbolToken by seq( pattern("a-zA-Z!#\$%&*/:<=>?@\\^_|~+-"), - pattern("a-zA-Z0-9!#\$%&*/:<=>?@\\^_|~+-")).star() - private val symbol = symbolToken.flatten("Symbol expected") + pattern("a-zA-Z0-9!#\$%&*/:<=>?@\\^_|~+-"), + ).star() + private val symbol by symbolToken.flatten() - private val characterRaw = pattern("^\"") - private val characterEscape by seqMap(char('\\'), any()) - private val character by or(ref(characterEscape), ref(characterRaw)) + private val characterRaw by pattern("^\"") + private val characterEscape by seq(char('\\'), any()) + private val character by or(characterEscape, characterRaw) private val `string` by seq( char('"'), character.star(), - char('"')) { _, it, _ -> it} - + char('"'), + ) - private val empty = ref(space).star() - private val cell by seq(atom, cells) - private val cells by or(ref(cell), ref(empty)) + private val empty by space.star() + private val cell by seq(ref(::atom), ref(::cells)) + private val cells: Parser by or(cell, empty) - private val numberToken by seqMap( - ref(anyOf("-+")).optional(), - char('0') or digit().plus(), - char('.').seq(digit().plus()).optional() & - anyOf('eE').seq(anyOf('-+').optional()).seq(digit().plus()).optional() + private val numberToken by seq( + anyOf("-+").optional(), + char('0') or digit().plus(), + char('.').seq(digit().plus()).optional(), + anyOf("eE").seq(anyOf("-+").optional()).seq(digit().plus()).optional(), ) - private val number = ref(numberToken).flatten("Number expected") + private val number by numberToken.flatten() - private val list by seqMap( + private val list by seq( char('('), cell, - char(')'), - ) { _, it, _ -> it.elements } - + char(')') + ) - private val atomChoice: Parser by or( + private val atom: Parser by or( list, number, string, @@ -67,5 +72,5 @@ class LispGrammar : Grammar() { splice ) - val start by atomChoice.star().end() -} \ No newline at end of file + val start by atom.star().end() +}